Sagen wir, ich habe eine Funktion:Werden Rückgabewerte von Rvalue-Referenz in C++ 0x übergeben?
typedef std::vector<int> VecType;
VecType randomVector();
int processing()
{
VecType v = randomVector();
return std::accumulate(v.begin(), v.end(), 0);
}
Does C++ 0x sagen speziell die falsche Kopie wird von der Rückgabewert von randomVector abgewendet werden? Oder müsste ein Compiler das RVO implementieren? Es scheint mir, als ob der Wert randomVector()
als ein rvalue behandelt werden sollte, und daher sollte der move-Konstruktor von v aufgerufen werden, aber ich bin mir nicht ganz sicher, ob das wahr ist.
Keine gute Frage, IMHO. Der Standard kann nicht sinnvoll angeben, was eine Implementierung tun darf, nur was sie tun muss. –
Eigentlich in dem Beispiel, das Sie angegeben haben, wird die Rückgabewertoptimierung von den meisten Compilern durchgeführt ... Es ist also effektiv ohne rvalue. Auch rvalue ist wichtiger für die Übergabe von Argumenten an Funktionen. – Artyom
Der Titel der Frage ist ein bisschen irreführend. Ihre Funktion gibt einen R-Wert und keine Referenz zurück. Aber eine Rvalue-Referenz kann an sie binden, was passiert, wenn die Kopier-Elision aus irgendeinem Grund nicht ausgeführt werden kann und der Typ einen Move-Konstruktor hat (Der Move-Konstruktor-Parameter ist eine Rvalue-Referenz) – sellibitze