Is NRVO part of the spec?

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Sat Feb 7 08:10:48 PST 2015


On 2/7/15 8:02 AM, Daniel Murphy wrote:
> "Andrei Alexandrescu"  wrote in message
> news:mb59ej$2j7s$1 at digitalmars.com...
>
>> > NRVO isn't required for correct semantics, as structs can be moved with
>> > bitcopy.
>>
>> It is required for structs that disable postblit. -- Andrei
>
> IIRC they only require that no copies are made.  They can still be moved.

Exactly - as you just said in the other post, the spec must clarify when 
things are guaranteed to be moved and not copied.

That includes:

1. URVO: returning an rvalue does not entail a copy.

2. Last return of a function local variable does not entail a copy.

That's actually more than NRVO because NRVO requires the same local be 
returned from all paths. Example:

T fun(bool b) {
   if (b) { T a; return a; }
   T b;
   return b;
}

This should work if T is noncopyable. It may be less efficient than it 
could though.

3. The more complicated/ambitious cases involve the last use of a value. 
Consider:

T fun() {
   T a;
   T b = a;
   return b;
}

Even though the code ostensibly makes a copy, it's the last use of a so 
that could be a move.

I think (3) could be used for optimization but it's too much of a 
headache to put in the language definition. We do need to have (1) and 
(2) covered.


Andrei



More information about the Digitalmars-d mailing list