Discussion: Rvalue refs and a Move construtor for D

Suleyman sahmi.soulaimane at gmail.com
Fri Sep 6 15:18:24 UTC 2019

On Thursday, 5 September 2019 at 22:57:27 UTC, kinke wrote:
> [...]

Seems workable. It only affects the case of moving an lvalue to 
an value parameter. But here are my observations:

1. `move` should always do what `forward` did in your example. It 
shouldn't touch the lvalue, for simply removing a call to the 
move constructor, because T.init is not always considered a valid 
state and resetting to T.init is a "move" operation but an 
uncontrolled one which leaves the object in an invalid state. 
Which why making __move behave just like rvalue ref is more 
sensible like your first attempt did. Ex:

     S lvalue;
     lvalue.i = 1;
     assert(lvalue.i == ??); // could be still 1 if wasn't 
consumed inside foo. this is valid behavior with rvalue ref.

This behavior is better than swapping lvalue with T.init.

2. What you have proposed so far only replaces rvalue ref 
parameters. You haven't tackled rvalue ref returns. What do you 
propose as an alternative. Ex:

     @rvalue ref get(@rvalue ref S arg) { return arg; } // 
receives pointer and returns it
     void foo(@rvalue ref S);

     S lvalue;
     foo(get(lvalue)); // no copy or move happens only pointers 
being passed

What is your alternative for this.

More information about the Digitalmars-d mailing list