"Wenn Sie einen Wert (keine Referenz) von der Funktion zurückgeben und ihn dann an eine Konstante const in der aufrufenden Funktion binden, würde seine Lebensdauer auf den Bereich der aufrufenden Funktion erweitert werden."
Also: FALL A
%Vor% Gibt einen Wert vom Typ const BoundingBox
von der Funktion GetBoundingBox()
Variante I: (Binde es an eine const Referenz)
%Vor%Variante II: (Binden Sie es an eine konstante Kopie)
%Vor% Beide funktionieren einwandfrei und ich sehe nicht, dass das l_Bbox
-Objekt den Gültigkeitsbereich verlässt. (Obwohl ich in Variante eins verstehe, wird der Kopierkonstruktor nicht aufgerufen und ist daher etwas besser als Variante II).
Auch zum Vergleich habe ich die folgenden Änderungen vorgenommen.
Fall B
%Vor%mit Varianten: Ich
%Vor%und II:
%Vor% Das Objekt l_Bbox
geht immer noch nicht aus. Wie wird die Lebensdauer des Objekts wirklich auf den Gültigkeitsbereich der aufrufenden Funktion ausgedehnt, wenn "es an eine Konstante const in der aufrufenden Funktion gebunden wird und dessen Gültigkeitsdauer auf den Bereich der aufrufenden Funktion erweitert wird?"
Vermisse ich hier etwas Triviales?
Normalerweise hat ein temporäres Objekt (wie eines, das von einem Funktionsaufruf zurückgegeben wird) eine Lebensdauer, die bis zum Ende des "einschließenden Ausdrucks" reicht. Bei einer temporären Bindung an eine Referenz wird jedoch die Lebensdauer des Objekts auf die Lebensdauer der Referenz "heraufgesetzt" (die die Lebensdauer der aufrufenden Funktion sein kann oder nicht), es gibt jedoch einige Ausnahmen. Dies wird durch den Standard in 12.2 / 5 "Temporäre Objekte" abgedeckt:
Das Temporäre, an das die Referenz gebunden ist, oder das Temporäre, das das vollständige Objekt für ein Unterobjekt ist, an das das Temporäre gebunden ist, bleibt für die Lebensdauer der Referenz bestehen, außer wie unten angegeben. Eine temporäre Bindung an ein Referenzelement im Konstruktor ctor-initializer (12.6.2) bleibt bestehen, bis der Konstruktor beendet wird. Eine temporäre Bindung an einen Referenzparameter in einem Funktionsaufruf (5.2.2) bleibt bis zum Abschluss des vollständigen Ausdrucks bestehen, der den Aufruf enthält.
Weitere Informationen finden Sie in den folgenden Abschnitten:
Ein Beispiel, das helfen könnte, zu visualisieren, was vor sich geht:
%Vor%Was anzeigt:
%Vor% Erstens wird die Lebensdauer des temporären Objekts auf die Lebensdauer der const-Referenz erweitert, die an sie gebunden ist, nicht "an den Umfang der aufrufenden Funktion" (obwohl vielleicht das, was Sie mit dieser seltsamen Formulierung meinten) Funktion"). Dies ist, was Ihre CASE A
veranschaulicht, wo Sie eine const Referenz an ein temporäres anhängen. Das Temporäre lebt so lange, wie die Referenz lebt. Wenn die Referenz ihre Lebensdauer beendet, wird das temporäre Objekt ebenfalls zerstört.
Zweitens ist Ihr CASE B
einfach schlecht geformt, nicht kompilierbar. Nämlich das
ist illegal. In C ++ ist es illegal, einen nichtkonstanten Verweis auf ein temporäres Objekt anzuhängen. Wenn Ihr Compiler dies zulässt, muss es eine Eigenart / Erweiterung Ihres Compilers sein, die wenig mit C ++ - Sprache zu tun hat.
Der Punkt ist, dass der Wert bei der Rückgabe nach Wert in die Variable kopiert wird, der Sie das Ergebnis der Funktion zuweisen. (genau wie du gesagt hast - der Kopierkonstruktor wird aufgerufen). Keine lebenslange Erweiterung, Sie erstellen nur ein brandneues Objekt.
Wenn Sie als Referenz zurückkommen, übergeben Sie unter der Haube den Zeiger an die in der Funktion definierte Variable. Ein neues Objekt wird also nicht erstellt, Sie haben lediglich einen Verweis darauf außerhalb der Funktion. In diesem Fall wird die Lebensdauer einer Funktion-Inside-Variable erweitert.
Tags und Links const memory c++ pass-by-reference