Discussion: Rvalue refs and a Move construtor for D

Manu turkeyman at gmail.com
Fri Sep 6 22:32:55 UTC 2019


On Fri, Sep 6, 2019 at 2:15 PM Suleyman via Digitalmars-d
<digitalmars-d at puremagic.com> wrote:
>
> On Friday, 6 September 2019 at 19:50:30 UTC, kinke wrote:
> > On Friday, 6 September 2019 at 19:25:57 UTC, Manu wrote:
> >> There's another case where you can attribute a method with
> >> `@rvalue` to apply to the `this` reference. This should
> >> naturally work in D under the `@rvalue` proposal.
> >>
> >> Ie:
> >>
> >> struct S
> >> {
> >>   Thing member;
> >>   ref Thing fun() { return member; }
> >>   Thing fun() @rvalue { return move(member); }
> >> }
> >>
> >> This can be very valuable, and even more so in D where we use
> >> a lot of UFCS chains.
> >
> > Oh wow, this might be able to convince me, as returning an
> > rvalue ref from a method invoked on an rvalue instance would
> > allow absolutely perfect forwarding of members (no copy/move
> > and preserving rvalue-ness):
> >
> > struct S
> > {
> >   Thing member;
> >   ref Thing fun() { return member; }
> >   @rvalue ref Thing fun() @rvalue { return member; }
> >   // maybe we could even represent both at once via something
> > like:
> >   // auto ref Thing fun()() { return member; }
> > }
>
> I'm sorry but this looks like a bad idea. Moving selective parts
> of S simply because it's all marked for move is bad. What happens
> when the member is moved separately thus leaving an "empty" spot
> inside S then S itself is moved. That would result is a half
> valid object.

S is an rvalue; there are no other references to S. That's the point.


More information about the Digitalmars-d mailing list