ref + operator overloading question

Aleksey matklad at mail.ru
Mon Sep 16 14:01:47 PDT 2013


On Monday, 16 September 2013 at 20:53:18 UTC, Namespace wrote:
> 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.

Thank you! auto ref is exactly what I was looking for!


More information about the Digitalmars-d-learn mailing list