Vorausgesetzt, ich habe:
A GenerateA();
Bedeutet dies, dass es gültig sein sollte zu tun: B (GeneriereA ()) ?
, bedeutet das const ref, dass keine Kopie des A, das generateA () zurückgibt, fertig ist? Und das bedeutet, dass der Umfang des zurückgegebenen temporären erweitert wird, solange B existiert?
EDIT: Zusatzfrage aus den Kommentaren: Ist es akzeptabel, ein A & amp; von GenerateA () zu einem lokalen A, wenn der Lvalue ein const A & amp;?
istDanke!
Wie bereits von anderen angegeben, kann A GenerateA()
nicht kompilieren, wenn A
nicht kopierbar ist.
In Bezug auf const ref: nein wird die Lebensdauer des Temporären nicht auf die Lebensdauer von B ausgedehnt. Der Standard [12.2.5] besagt:
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 den zurückgegebenen Wert in einer Funktion return-Anweisung (6.6.3) bleibt bestehen, bis die Funktion beendet wird.
Also ja, die Verlängerung der Lebensdauer eines temporären existiert in einigen Kontexten (und ist manchmal wirklich nützlich: siehe diesen Artikel ), aber nicht in dem, den Sie vorgestellt haben.
In Bezug auf Ihre letzte Frage ist es nicht legal, einen Verweis auf eine lokale Variable von GenerateA()
zurückzugeben (und das Ergebnis an eine const-Referenz zu binden, ist keine Hilfe).
Wenn A
nicht kopierbar ist, dann ist die Funktion A GenerateA()
ungültig, da die Rückgabe nach Wert das Erstellen einer Kopie erfordert.
Wenn die Funktion stattdessen eine Referenz (d. h. A &GenerateA()
) zurückgibt und die Referenz auf ein lokal erstelltes Objekt A
ist, wird sie ungültig, sobald die Funktion beendet wird. C ++ hat keine Form der Speicherbereinigung, daher gibt es keine Möglichkeit, die Lebensdauer eines Objekts zu verlängern, solange es verwendet wird.
Tags und Links const c++ reference noncopyable