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