Can we fix reverse operator overloading (opSub_r et. al.)?

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Tue Jul 7 00:41:18 PDT 2009


Don wrote:
> Currently, template versions of opXXX_r appear to be useless.
> Consider:
> 
> struct A
> {
>    int opSub(T)(T x) { return 1; }
>    int opSub_r(T)(T x) { return -1; }
> }
> 
> A a;
> int x = a - a; // is this a.opSub(a) or a.opSub_r(a) ???
> 
> This is annoying and rather silly. I can't imagine a case where you 
> would template opXXX_r, without also templating opXXX. And by 
> definition, a.opSub(a) is identical to a.opSub_r(a). Templated opSub_r 
> has a broken design in both D1 and D2.
> 
> We could fix it by adding a rule to operator overloading:
> 
> [New rule] 1. If a and b have the same type, the expression is written 
> as a.opfunc(b).
> [Existing rules] 2. If any a.opfunc or b.opfunc_r functions exist, then 
> overloading is applied across all of them and the best match is used.
> ...
> 
> Patching this is pretty easy. For example, in DMD2.031, opover.c, line 
> 263, simply add:
> 
>      if ((t1 == t2)) {
>         //  x OP x can only be x.opOP(x), not x.opOP_r(x)
>         s_r = NULL;
>     }


I recently ran into the exact same issue, so I agree completely.

-Lars



More information about the Digitalmars-d mailing list