On 05/21/2013 08:24 PM, Maxim Fomin wrote:
...

According to the spec (overload page and TDPL) operators are rewritten
specifically named *member* functions and calling *member* function is
not the same thing as syntax to call free functions like member
functions due to:
- non-member (UFCS) functions cannot be virtualized and overridden
- they do not appear in get members traits
- they cannot access all fields in general.


This is not too relevant for the current discussion since we are discussing operator overloading using opDispatch, which can be a member function.

Using your rewriting notation

Not really.

operator overloading is defined as (a -
expression, b - some member function other than opDispatch, c -
opDispatch): if (a && b) then a->b else error. Opdispatch is defined as:
if(!b && c) then b->c else error.


I guess I understand what you mean, but you are missing the specification of Eg. the opSlice rewrite which would render the discussion meaningful.

Also, the language spec does not suggest a differentiation as is present in those rules between a and b.

So, compiler works according to the spec.

By the way, your logic for a->b->c leads to following flaw:

class A
{
    void opSlice(){}
    void opDispatch(){}
}
..
a[] // unconditionally calls opDispatch since '[]'->'opSlice'->'opDispatch'

Using your notation, if you assume there is both a rewrite '[]'->'opSlice' and 'opSlice'->'opDispatch' then yes.

The assumption of existence of a rewrite 'opSlice'->'opDispatch' is what introduces the flaw.

The spec correctly states that there is no 'opSlice'->'opDispatch' rewrite in this case, as it can be resolved otherwise.

Reply via email to