Hat diese const-Referenz ihr Leben erhalten?

8

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?

%Vor%     
Steve Lorimer 31.05.2017, 20:34
quelle

3 Antworten

4

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.

%Vor%

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:

%Vor%

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.

    
Xirema 31.05.2017, 20:55
quelle
2

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.

    
user2357112 31.05.2017 20:48
quelle
1

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:

%Vor%

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:

%Vor%

Dann ist die Ausgabe:

%Vor%     
Stephan Lechner 31.05.2017 21:24
quelle

Tags und Links