Ich habe diese Antwort auf die Frage " Verlängert eine const-Referenz das Leben eines Temporären? ", das besagt:
Nur lokale
const
Referenzen verlängern die Lebensdauer.
Ich fürchte, mein Standarde ist nicht auf dem neuesten Stand, um zu wissen, ob foo
, unten, eine lokale const-Referenz ist oder nicht.
Verlängert mein const std::string& foo
die Lebensdauer des temporären std::string
Funktionsarguments, das im Aufruf von get_or
erstellt wurde, oder habe ich eine freie Referenz?
const&
verlängert die Lebensdauern in dieser Situation nicht. Betrachten Sie das Beispiel hier , das ein temporäres Konstrukt erstellt und dann versucht, es zu drucken: es verwendet dieselben Konstrukte wie Ihr Code, aber ich habe es geändert Objektkonstruktion und -zerstörung für den Benutzer expliziter zu machen.
Ausgabe:
%Vor% Beachten Sie, wie das Objekt zerstört wird, bevor printing.
angezeigt wird.
Sie fragen sich vielleicht, warum der Code immer noch ohne sichtbare Fehler abgeschlossen wird: Er ist das Ergebnis von Undefined Behavior. Das betreffende Objekt existiert nicht, aber da es nicht darauf ankommt, dass der Zustand seine Methode aufruft, stürzt das Programm nicht ab. Andere, kompliziertere Beispiele sollten keine Garantie dafür bieten, dass dies ohne Absturz oder andere unerwartete Verhaltensweisen funktioniert.
Übrigens sind die Dinge etwas anders, wenn das temporäre direkt an das const&
gebunden ist:
Ausgabe:
%Vor%Sehen Sie, wie das Objekt erst nach der Verwendung zerstört wird. In dieser Situation überlebt das Objekt bis zum Ende des Bereichs.
Sie haben die Zeichenfolge durch zu viele Referenzen übergeben.
Das Binden der temporären Zeichenfolge an den def
-Parameter von get_or
verlängert die Lebensdauer der Zeichenfolge bis zum Ende des vollständigen Ausdrucks, der den Funktionsaufruf enthält, aber def
an den Rückgabewert von get_or
und Bindung bindet Der Rückgabewert von get_or
zu foo
verlängert die Lebensdauer nicht weiter. Die Zeichenfolge ist tot, wenn Sie versuchen, sie zu drucken.
Das fragliche "temporary" ist das std::string
-Objekt, das beim Aufruf von get_or
mit einem Parameter vom Typ const char*
erstellt wurde. Die Lebensdauer dieses temporären Objekts ist mit dem Ende der Funktion get_or
begrenzt, und die Tatsache, dass Sie eine Referenz auf dieses temporäre Objekt zurückgeben und es danach zuweisen, verlängert die Lebensdauer nicht. Siehe den folgenden Code, der eine einfache "benutzerdefinierte" String-Klasse verwendet, die cout
s Konstruktion und Zerstörung:
Ausgabe:
%Vor% Beachten Sie, dass der Destruktor aufgerufen wird, bevor Sie foo
verwenden können.
Die Situation ist anders, wenn Sie einen Verweis auf ein temporäres direkt zuweisen. Auch hier ist die Lebensdauer bis zum Ende der Funktion main
, aber sie wird in main
und nicht in irgendeiner Funktion verwendet, die main
aufruft:
Dann ist die Ausgabe:
%Vor%Tags und Links c++