Was macht std::move() mit L-Werten?
std::move() ist ein leistungsstarkes Tool in C zur Erleichterung perfekte Weiterleitung. Doch die Umsetzung kann auf den ersten Blick einige Stirnrunzeln hervorrufen. Um zu verdeutlichen, wie std::move() dies erreicht, schauen wir uns die Feinheiten seiner Implementierung an.
Die Funktion „Verschieben“ verstehen
Wir beginnen mit die vereinfachte Version der Funktionsvorlage „Verschieben“:
template <typename T> typename remove_reference<T>::type&& move(T&& arg) { return static_cast<typename remove_reference<T>::type&&>(arg); }
Fall 1: Übergabe an R-Wert
Wenn std::move() mit einem R-Wert (einem temporären Objekt oder einem Ausdruck, der einen R-Wert ergibt) aufgerufen wird, wird die Verschiebungsvorlage wie folgt instanziiert:
// move with [T = Object]: remove_reference<Object>::type&& move(Object&& arg) { return static_cast<remove_reference<Object>::type&&>(arg); }
Da „remove_reference
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Wie erwartet wandelt die Funktion einfach ihr R-Wert-Argument in eine R-Wert-Referenz um.
Fall 2: Übergabe eines L-Werts
Nun tritt der interessante Fall auf, wenn std::move() mit an aufgerufen wird lvalue (eine benannte Variable oder ein Ausdruck, der zu einem lvalue ausgewertet wird).
Object a; // a is lvalue Object b = std::move(a);
Dieses Mal instanziiert die Verschiebungsvorlage zu:
// move with [T = Object&] remove_reference<Object&>::type&& move(Object& && arg) { return static_cast<remove_reference<Object&>::type&&>(arg); }
Nochmals: „remove_reference
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Auf den ersten Blick erscheint dies kontraintuitiv, da wir einen L-Wert übergeben haben. Allerdings führt C 11 das Konzept des Referenzkollabierens ein, das die Interpretation der Referenzsyntax ändert:
Unter diesen Regeln verhält sich Objekt& && effektiv wie Objekt&, eine gewöhnliche L-Wert-Referenz, die an L-Werte gebunden werden kann.
Daher wird die endgültige Form der Funktion :
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
Im Wesentlichen wandelt std::move() das lvalue-Argument in eine rvalue-Referenz um, Ermöglicht eine perfekte Weiterleitung unabhängig vom Eingabetyp.
Das obige ist der detaillierte Inhalt vonWie behandelt std::move() L-Werte in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!