safe method overloading with different refness of its arguments

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jul 4 05:06:36 PDT 2017


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.


More information about the Digitalmars-d-learn mailing list