safe method overloading with different refness of its arguments

drug via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jul 4 05:09:39 PDT 2017


04.07.2017 15:06, Basile B. пишет:
> On Tuesday, 4 July 2017 at 10:40:42 UTC, drug wrote:
>> ```
>> struct Foo
>> {
>>     ubyte width, length;
>>
>>     // by reference
>>     bool opEquals(ref const(Foo) other) const pure @safe
>>     {
>>         if (width != other.width)
>>             return false;
>>         if (length != other.length)
>>             return false;
>>     return true;
>>     }
>>
>>     // by value
>>     bool opEquals(const(Foo) other) const pure @safe
>>     {
>>         return opEquals(other);
>>     }
>> }
>> ```
>>
>> It works for me, but I'm curious - will compiler always recognize what
>> to call and I can avoid recursion and stack overflow or I shouldn't do
>> so?
>
> No, not always. One out of two hundreds the compiler fails to recognize
> the right call.
> Jokes aside if you're not sure just use a templated function with `auto
> ref` parameter.
Thank you for the hint. It works and even tests pass)


More information about the Digitalmars-d-learn mailing list