ref + operator overloading question

Namespace rswhite4 at googlemail.com
Mon Sep 16 13:53:16 PDT 2013


On Monday, 16 September 2013 at 20:43:01 UTC, Aleksey wrote:
> I get strange type errors in the following code, and I don't
> understand why =( Could anybody help?
>
> struct I {
>       int i;
>       I opBinary(string op)(ref I that)
>       if (op == "+") {
>           return I(i + that.i);
>       }
> }
>
> void main() {
>       auto a = I(1);
>       auto d = a + (a + a);
> }
>
> Error: incompatible types for ((a) + (a.opBinary(a))): 'I' and 
> 'I'
>
> If I remove ref or parens around (a+a) the code compiles just
> fine.

opBinary returns a rvalue. But your code accepts only lvalues.
(a + a) produce an rvalue so a + (a + a) is the same as lvalue + 
rvalue and rvalues aren't accepted. You could use auto ref for 
that purpose.


More information about the Digitalmars-d-learn mailing list