On 1/8/18 6:07 PM, Jiyan wrote:

Sry i know i asked it already in IRC:
Are rvalue references already solved with auto ref?

https://p0nce.github.io/d-idioms/#Rvalue-references:-Understanding-auto-ref-and-then-not-using-it

Says rvalues are moved!

But an rvalue move is cheaper. You construct it right on the stack where it needs to be, and no actual copy is happening. Then inside the function, no further indirections are needed, just stack offsets.

The other solution seems not so practical.

The other solution exploits a hole in the "rvalues cannot be references" mantra. Because all member functions take 'this' by reference, the function call can be used to blur the line between rvalues and lvalues.

It makes for some... interesting things:

struct Int
{
   int value;
   Int opBinary(string op : "+")(ref const Int other) const
   {
       return Int(other.value + value);
   }
}

auto v = Int(5);

auto v2 = s + Int(5); // error
auto v3 = Int(5) + s; // OK!

Is any solution to them intended, or was all the talk about rvalue references simply discarded?

auto ref was actually proposed as a non-template solution, but Walter implemented it the way it is now. The original proposal would have meant that rvalue references like C++ were possible (without conflating it with const).

But current auto ref is what we have, so I would recommend using it.

-Steve

Reply via email to