On Sunday, 18 August 2013 at 21:23:05 UTC, Namespace wrote:
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. :)

The possibility of static operator was raised, specifically for opDollar, in std.range, for the possibility of it automatically resolving to length.

Reception for *just* this was kind of cold. I remember it being downright hostile for UFCS operators in general.

The full conversation is here:
http://d.puremagic.com/issues/show_bug.cgi?id=7177
Note that while UFCS was discussed, it wasn't the root of the discussion :/

Reply via email to