Operator overloading through UFCS doesn't work
Tommi
tommitissari at hotmail.com
Sat Oct 13 01:36:18 PDT 2012
Quote from TDPL: "D’s approach to operator overloading is
simple: whenever at least one participant in an operator
expression is of user-defined type, the compiler rewrites the
expression into a regular method call with a specific name. Then
the regular language rules apply."
According to the above, I think the following code should work:
struct MyStruct
{
int _value;
}
ref MyStruct opUnary(string op : "++")(ref MyStruct ms)
{
++ms._value;
return ms;
}
MyStruct opBinary(string op : "+")(MyStruct ms, int value)
{
return MyStruct(ms._value + value);
}
void main()
{
MyStruct ms;
ms.opUnary!"++"(); // #1: OK
MyStruct ms2 = ms.opBinary!"+"(1); // #2: OK
++ms; // #3
MyStruct ms3 = ms + 1; // #4
}
#3: Error: 'ms += 1' is not a scalar, it is a MyStruct
#4: Error: incompatible types for ((ms) + (1)):
'MyStruct' and 'int'
I'd expect the lines tagged #3 and #4 to be rewritten by the
compiler like so:
ms.opUnary!"++"();
MyStruct ms3 = ms.opBinary!"+"(1);
So, the inability to do operator overloading though UFCS must be
a compiler bug, right?
More information about the Digitalmars-d-learn
mailing list