Wenn ich den folgenden Code schreibe:
%Vor% Dann beschwert sich g++
:
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:
Gibt es im Allgemeinen eine Möglichkeit, die Lebensdauer einer R-Referenz zu kennen?
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)
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).
Tags und Links c++ c++11 g++ rvalue-reference xvalue