Werden Rückgabewerte von rvalue Referenz in c weitergegeben werden ++ 0x?
-
19-09-2019 - |
Frage
Lassen Sie uns sagen, ich habe eine Funktion:
typedef std::vector<int> VecType;
VecType randomVector();
int processing()
{
VecType v = randomVector();
return std::accumulate(v.begin(), v.end(), 0);
}
Hat C ++ 0x sagt speziell die falsche Kopie wird von dem Rückgabewert von randomVector abgewendet werden? Oder würde ein Compiler müssen die RVO implementieren? Es scheint mir, wie der Wert randomVector()
sollte als R-Wert behandelt werden, und somit v Umzug Konstruktor aufgerufen werden soll, aber ich bin mir nicht ganz sicher, dass dies wahr ist.
Lösung
Die Regel ist das folgende
- Wenn die Compiler RVO tun können, dann ist es erlaubt, es zu tun, und keine Kopie und keine Bewegung gemacht wird.
- Andernfalls wird der entsprechende Konstruktor genommen.
Wie Sie sagen, ist die temporäre ein rvalue und damit der Umzug Konstruktor wird ausgewählt, weil in der Regel in 13.3.3.2/3
, die besagen, dass eine R-Wert Referenz auf einen R-Wert besser als eine L-Wert-Referenz bindet. Bei der Entscheidung darüber, ob die Bewegung oder den Kopierkonstruktor zu verwenden, wird die Überladungsauflösung dafür den Umzug Konstruktor bevorzugen.
Die Regel, dass der Compiler erlaubt ist RVO durchzuführen, ist bei 12.8/15
geschrieben.
Andere Tipps
Alle Rückgabewerte betrachtet werden rvalues
so, wenn der Compiler RVO nicht auf diesem Fall setzen sie den Umzug Konstruktor statt der Copykonstruktor verwenden müssen.