2010-06-09 9 views
5

Ich brauchte einige Zeit, um den Unterschied zwischen einem rvalue und einem temporären Objekt zu verstehen. Aber jetzt die endgültige Ausschussentwurf Staaten auf Seite 75:rvalues ​​und temporäre Objekte in der FCD

Ein rvalue [...] ist ein xValue, ein temporäres Objekt oder subobject davon, oder ein Wert, der nicht mit einem verbunden ist Objekt.

Ich kann meinen Augen nicht glauben. Das muss ein Fehler sein, oder?


Um zu klären, ist hier, wie ich die Begriffe verstehen:

#include <string> 

void foo(std::string&& str) 
{ 
    std::cout << str << std::endl; 
} 

int main() 
{ 
    foo(std::string("hello")); 
} 

In diesem Programm gibt es zwei Ausdrücke, die die gleiche temporäre Objekt bezeichnen: die prvalue std::string("hello") und die L-Wert str. Ausdrücke sind keine Objekte, aber ihre Auswertung könnte einen ergeben. Insbesondere die Auswertung eines Prvalue liefert ein temporäres Objekt, aber ein Prvalue ist kein temporäres Objekt. Ist jemand mit mir einverstanden oder bin ich verrückt geworden? :)

+2

Sie könnten in Betracht ziehen, die Standardnutzer direkt zu fragen, indem Sie eine Frage an comp.lang.C++ stellen: std –

+0

@Noah: Ich tat. Mal sehen was passiert :) – fredoverflow

+0

[link zu comp.std.C++ thread] (http://groups.google.de/group/comp.std.c++/browse_thread/thread/5cdae718218a462c) – fredoverflow

Antwort

2

Ja, ich stimme dir zu. Dies sollte meiner Meinung nach behoben werden, und einige Leute, die ich zutiefst respektiere, haben genau die gleiche Frage zu diesem Thema gestellt.

0

Dies ist nicht so kompliziert wie es klingt. Ich beziehe mich auf die jetzt fertiggestellte Norm ISO/IEC 14882-2011. Seite 78 sagt:

Ein xValue (ein „auslaufender“ Wert) bezieht sich auch auf ein Objekt, in der Regel in der Nähe von das Ende seiner Lebensdauer (so dass seine Ressourcen bewegt werden können, für Beispiel). Ein xvalue ist das Ergebnis bestimmter Arten von Ausdrücken mit Rvalue-Referenzen (8.3.2).

Das Fett oben wurde von mir hinzugefügt. Der Standard weiteres sagt:

rvalue (so genannt, historisch gesehen, weil rvalues ​​auf die rechte Seite eines Zuweisungsausdruckes erscheinen könnte) ist ein xValue, ein temporäres Objekt (12.2) oder Subobjekt davon, oder ein Wert, der nicht mit einem Objekt zugeordnet ist.

So erhalten Sie nur einen xvalue, wenn Sie mit 'bestimmte Arten von Ausdrücken mit Rvalue-Referenzen spielen'. Ansonsten sind Ihre temporären Objekte genau das - temporäre Objekte.

+0

Die eingebettete Frage wurde entfernt. Stellen Sie es als eine andere Frage. – quantum