Operator overloading through UFCS doesn't work

Maxim Fomin maxim at maxim-fomin.ru
Mon Oct 15 02:33:22 PDT 2012


On Sunday, 14 October 2012 at 20:15:15 UTC, Tommi wrote:
> On Sunday, 14 October 2012 at 07:14:25 UTC, Maxim Fomin wrote:
>> If this request is approved and compiler has opUnary 
>> definition outside type (which suits better then alias
>> this) such function would hijack alias this.
>
> Free functions cannot and must not ever hijack, i.e. modify 
> existing functionality of a type. Free functions should only be 
> able to add new functionality to a type. This is what currently 
> happens with alias this vs free function which is accessed 
> through UFCS:
<snip>

This shows current behavior. The issue is future behavior of code 
like this:

---foo.d---
struct A
{
    int i;
    alias i this;
}
---bar.d---
int opUnary(string T)(A a) { ... }
...
{
   ++a;
}
-----------
I. i is incremented, opUnary is not called. However opUnary 
matches better to the actual type and if it were a method, it 
would be called - another special issue in the language which 
breaks usual logic. And if you declared opUnary in bar.d when 
alias this was absent in foo.d and later added - hijacking also 
occurs but now it happens from another side. Bad.

II. opUnary is called, i is not incremented. On the one hand you 
get what you wanted - you supplied opUnary and it is called. At 
least this is consistent with matching behavior. On the other 
hand, it is hijacking from position of foo. Bad.

III. Compiler issues error if you try to define some free 
functions which are similar to existing methods (code above is 
particular case) or if you declare operator overloading methods 
in the presence of alias this. This prevents from making 
confusion but if you link to some library, update code and its 
author defines new method, which is similar to your UFCS 
function, you get errors and have to rewrite code.

IV. Do nothing and leave things as they are. Presence of opUnary 
function doesn't affect operator overloading. While current UFCS 
behavior falls in the first category (newly created foo.d methods 
hijack bar's free functions) there are no such problems with 
operator overloading methods. And operator overloading requires 
methods, not just free functions. Although methods and free 
functions may be called similar in source code, they still are 
different - in runtime calling, in mangling, in requiring 
contract invocation, argument passing, etc.


More information about the Digitalmars-d-learn mailing list