Discussion: Rvalue refs and a Move construtor for D

Manu turkeyman at gmail.com
Fri Sep 6 22:34:53 UTC 2019


On Fri, Sep 6, 2019 at 3:32 PM Manu <turkeyman at gmail.com> wrote:
>
> 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.

This doesn't come up very often, but when you need it, it has been a
massive performance opportunity for us.


More information about the Digitalmars-d mailing list