Wird die Lebensdauer eines xvalue erweitert, wenn er an einen Const lvalue Verweis gebunden ist?

8

Wenn ich den folgenden Code schreibe:

%Vor%

Dann beschwert sich g++ :

%Vor%

Ok, danke an Was sind rvalues, lvalues, xvalues, glvalues? , und prvalues? Ich verstehe, dass ein xvalue bedeutet, dass es "abläuft", was sinnvoll ist. Aber jetzt, wenn ich das tue:

%Vor%

Das funktioniert ganz gut und es wird eine Adresse gedruckt. Also, ich habe ein paar Fragen:

  1. Wenn der Wert bald abläuft, warum kann ich darauf verweisen? Die Referenz hält das ursprüngliche Objekt nicht am Leben (richtig?).
  2. Führt eine solche Referenz zu undefiniertem Verhalten? Z.B. weil wir auf ein Objekt verweisen, das möglicherweise zerstört wurde?

Gibt es im Allgemeinen eine Möglichkeit, die Lebensdauer einer R-Referenz zu kennen?

    
FatalError 27.02.2012, 15:47
quelle

2 Antworten

3

Klausel 12.2, Absätze 4-5, besagt, dass die Lebensdauer im zweiten Beispiel erweitert wurde

  

Es gibt zwei Kontexte, in denen Provisorien an einem anderen Punkt als dem Ende des Volltexts zerstört werden. ...

     

Der zweite Kontext ist, wenn eine Referenz an eine temporäre gebunden ist. Das Temporäre, an das die Referenz gebunden ist, oder das Temporäre, das das vollständige Objekt eines Unterobjekts ist, an das die Referenz gebunden ist, bleiben für die Lebensdauer der Referenz bestehen, mit Ausnahme von:
  (Keine der Ausnahmen gilt hier)

    
Bo Persson 27.02.2012, 16:21
quelle
9

Vielleicht bin ich alleine, aber ich denke, das ist nicht sicher:

%Vor%

Die Lebensdauerverlängerungsregeln gelten nur, wenn die Referenz durch einen Ausdruck initialisiert wird, der sich direkt auf ein temporäres Objekt bezieht. Mit anderen Worten, der Ausdruck muss das Attribut "temporary" enthalten. Wenn Sie die (int&&) weglassen, wird der Compiler zur Bindung an die Referenz implizit einen prvalue-Ausdruck erstellen, der auf ein temporäres Objekt verweist, das mit dem Wert 123 initialisiert wird, und die lebenslange Verlängerung gilt dann.

Aber wenn Sie rvalue-Referenzen dazwischen mischen, hat der Compiler keine Möglichkeit, zu Kompilierzeit zu wissen, ob die Lebensdauer des referierten Objekts verlängert werden soll oder nicht.

%Vor%

Ich denke daher, dass Ihr Code ein undefiniertes Verhalten hat, weil Sie eine hängende Referenz auswerten (auch wenn Sie nur die Adresse verwenden).

    
Johannes Schaub - litb 27.02.2012 22:09
quelle