Der Code ist:
A foo() {return A();}
Wenn foo()
genannt wird, die Reihenfolge der Effekte ist:
- Temporary von
A()
erstellt A
‚s Standard-Konstruktor verwenden.
- Rückgabewertobjekt vom Typ
A
, das mit dem Konstruktor copy/move erstellt wurde, mit dem temporären Argument von Schritt 1 (dh Konstruktor verschieben, falls vorhanden, andernfalls Konstruktor kopieren).
- Temporär von Schritt 1 wird zerstört.
Dies ist jedoch ein copy elision Kontext, so dass die Compiler alle 3 Stufen in eine kombinieren könnten, und erstellen Sie das Rückgabewert Objekt mit A
‚s Standard-Konstruktor.
Was mit dem Rückgabewertobjekt passiert, hängt davon ab, was der aufrufende Code tut. Es könnte weitere Kopie Elision geben. In der Verwendung:
int i = foo().bar();
nichts anderes passiert; bar()
wird am Rückgabewertobjekt aufgerufen, der Wert wird i
zugewiesen, und dann wird das Rückgabewertobjekt zerstört.
Die Frage kann einfach auf 'A foo() {return A(); } ', keiner der übrigen ist relevant. Und dann ... welcher Konstrukteur denkst du? Es ist einfach zu instrumentieren und herauszufinden. Fragen Sie die Ergebnisse, die Sie bekommen haben? – Barry
@Barry nicht unbedingt leicht zu testen, wegen der Kopie Elision –
Wie ich herausgefunden habe - mein Problem wurde durch Kopie elision verursacht. –