Move-Semantik
-
Matzer schrieb:
Ich dachte folgendes wäre äquivalent:
// Sei A irgendeine Klasse A getA(){ A a; return a; } A oneA = getA(); A anotherA = A();da nach der Auswertung von getA() auf der rechten Seite im Grunde auch nur eine Temporary stehen würde?
Richtig. In beiden Fällen handelt es sich auf der rechten Seite um einen "RValue-Ausdruck". Wenn Du "A()" in der zweiten Zeile durch "oneA" ersetzt, steht auf der rechten Seite ein "LValue-Ausdruck". Das ist ein Unterschied bzgl Optimierungen oder "move-only"-Typen wie unique_ptr. Ein unique_ptr-Objekt soll ja nicht kopiert werden können. Man will keine destruktive Kopie (Kopie, die das Quellobjekt verändert). Und man will auch keine Doppellöschungen. Die Idee ist eben die, unique_ptr-Objekte "umziehen" zu lassen und das Quellobjekt nur dann zu "zerstören" (den Zeiger darin auf 0 zu setzen), falls es keiner merkt (temporäres Objekt) oder falls es explizit erwünscht wurde (move(...)-Syntax).