Was ist R-Wert-Referenz, die in der nächsten C ++ Standard kommen, ist über?
-
21-08-2019 - |
Frage
Was ist R-Wert-Referenz, die in der nächsten c kommen ist etwa ++ Standard?
Lösung 3
Hier ist eine wirklich lange Artikel von Stephan T. Lavavej
Andere Tipps
Schauen Sie sich auf Warum sind C ++ 0x rvalue Referenz nicht der Standard? , die ihre praktische Anwendung ziemlich gut erklärt.
Es ermöglicht Ihnen, zwischen Code zu unterscheiden, die Sie vorbei einen Verweis auf ein r-Wert oder einen L-Wert genannt hat. Zum Beispiel:
void foo(int &x);
foo(1); // we are calling here with the r-value 1. This would be a compilation error
int x=1;
foo(x); // we are calling here with the l-value x. This is ok
Durch die Verwendung eines R-Referenzwertes, können wir oben in Bezugnahme auf Provisorien wie im ersten Beispiel passieren lassen:
void foo(int &&x); // x is an r-value reference
foo(1); // will call the r-value version
int x=1;
foo(x); // will call the l-value version
Das ist interessanter, wenn wir wollen, sind den Rückgabewert einer Funktion zu übergeben, die ein Objekt an einem anderen Funktion erzeugt, die das Objekt verwendet wird.
std::vector create_vector(); // creates and returns a new vector
void consume_vector(std::vector &&vec); // consumes the vector
consume_vector(create_vector()); // only the "move constructor" needs to be invoked, if one is defined
Der Umzug Konstruktor wirkt wie der Copykonstruktor, aber es ist so definiert einen r-Wert Bezug zu nehmen, anstatt eine L-Wert (const) Referenz. Es ist erlaubt, zu r-Wert Semantik verwenden, um die Daten aus den temporären in create_vector
erstellt zu bewegen und sie in das Argument schieben, ohne dabei eine teure Kopie aller Daten in dem Vektor consume_vector
.