Ich versuche, mehr über rvalue-Referenzen zu erfahren, aber ich habe mich in diesem einfachsten Beispiel festgefahren:
%Vor% Ich habe es mit Clang 3.2 und -std=c++11 -fno-elide-constructors
kompiliert (um (N) RVO zu vermeiden), aber das Ergebnis ist überraschend für mich:
Ich habe genau das erwartet, bis auf die erste ~C()
. Woher kam es und was fehlt mir, weil es 2 Konstruktionen und 3 Zerstörungen gibt? Ist das & amp; & amp; Konstruktor aufgerufen mit einer zerstörten Objektreferenz ??
Dies muss ein Fehler sein. Der Destruktor für das lokale Objekt, das in foo()
erstellt wurde, wird vor dem Verschiebungskonstruktor des empfangenden Objekts aufgerufen. Insbesondere scheint es, dass ein temporäres Objekt zugewiesen, aber nicht (move-) konstruiert wurde, wenn es nach Wert zurückgegeben wird. Das folgende Programm zeigt dies:
Ausgabe:
%Vor% Das Erstellen von zwei -Objekten innerhalb von foo()
scheint mehr Licht auf das Problem zu werfen:
Ausgabe:
%Vor% Interessanterweise hängt dies davon ab, wie das Objekt in foo()
konstruiert wird. Wenn foo()
folgendermaßen geschrieben wird:
Dann erscheint der Fehler. Wenn es so geschrieben ist, tut es das nicht:
%Vor% Ausgabe mit der letzten Definition von foo()
: