K
pumuckl schrieb:
(* weil dadurch die "return value optimization" ausgeschaltet würde)
Sicher?
Ja.
pumuckl schrieb:
Kommt die (n)rvo nicht spät genug, um den move, der nichts tut, schon garnicht mehr zu sehen?
Copy elision ist nur dann erlaubt, wenn der "Quellausdruck" sich direkt auf ein temporäres Objekt (generell) oder ein funktionslokales Objekt (im Falle eines return-Statements) bezieht. Ein std::move() dazwischen liefert dir nur eine Referenz auf etwas.
Eine richtig blöde Idee ist dann so etwas:
string dings();
int main()
{
for (char c : move(dings())) {
cout << c;
}
cout << endl;
}
denn da rufste auf einmal undefiniertes Verhalten hervor, weil das temporäre Objekt, was dings zurück gibt, nicht lang genug am Leben bleibt. Die Regel, die die Lebenszeit eines temporären Objekts verlängert, greift auch nur dann, falls man ein "pure rvalue" (*) dort stehen hat. Der move-Ausdruck ist aber ein Xvalue.
(* ein static_cast<ObjectType&&>(x) geht sogar auch noch, meines Wissens nach, was ja ein Xvalue ist, aber eben kein Xvalue eines Funktionsaufrufs )