static / global operator overload

Namespace rswhite4 at googlemail.com
Sun Aug 18 14:23:04 PDT 2013


On Sunday, 18 August 2013 at 15:29:26 UTC, Ali Çehreli wrote:
> On 08/18/2013 07:34 AM, Namespace wrote:
>
> > In C++ you can declare operator overloads inside and outside
> of classes
> > (the latter is more popular)
>
> The latter is popular because a global operator takes advantage 
> of implicit type conversions. A global operator+ allows using 
> an int even on the left-hand side of the operator.
>
> As a result, assuming that MyInt can be constructed from an 
> int, when there is
>
>     // Assume this is defined outside of MyInt definition
>     MyInt operator+(MyInt lhs, MyInt rhs);
>
> the expression
>
>     1 + MyInt(2)
>
> is lowered to
>
>     operator+(MyInt(1), MyInt(2))
>
> > so why wasn't this introduced in D also?
>
> My guess is that there is no implicit construction of objects 
> in D anyway so there wouldn't be that benefit.
>
> Ali

It's also preferred (at least by me) because such methods don't 
have to be in a class/struct and blows it up. They don't effect 
the class/struct and thanks to UFCS we still could call them like 
member methods.
So IMO because they have no effect in a class/struct they 
shouldn't be there.

Compare:

bool opEquals(ref const A a) { ... } inside of struct A

versus:

bool opEquals(ref const A lhs, ref const A rhs) { ... }

I would prefer the last one.

But I would like to see an official thread for this, if any 
exist. Do you know one? I'm just startled that D follows this 
way. :)


More information about the Digitalmars-d-learn mailing list