On Saturday, 7 February 2015 at 16:10:48 UTC, Andrei Alexandrescu
wrote:
On 2/7/15 8:02 AM, Daniel Murphy wrote:
"Andrei Alexandrescu" wrote in message
news:mb59ej$2j7s$1...@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
Perfect. Clear and reasonable.