C ++ const lvalue Referenzen

8

Vorausgesetzt, ich habe:

  • Klasse A, die nicht kopierbar ist
  • Klasse B, die als Mitglied const A & amp; a (und nimmt ein A in seinem Konstruktor und setzt es in seiner Initialisierungsliste)
  • eine Funktion 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;?

ist

Danke!

    
please delete me 10.11.2010, 04:41
quelle

4 Antworten

3

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).

    
icecrime 10.11.2010, 07:24
quelle
4

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.

    
casablanca 10.11.2010 04:54
quelle
0

Ja und Nein.

Ja, der const-Verweis wird an die temporäre Variable gebunden. Nein, const-Referenzen, die Klassenmitglieder sind, verlängern die Lebensdauer nicht so, wie Const mit automatischer Dauer referenziert.

    
Ben Voigt 10.11.2010 04:51
quelle
0

Hier ist ein Beispiel :

%Vor%

Ausgabe:

%Vor%     
Will Bickford 10.11.2010 05:03
quelle

Tags und Links