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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top