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 'move'-Funktionsvorlage:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
Fall 1: Übergabe eines R-Werts
Wenn std::move() mit einem R-Wert aufgerufen wird (einem temporären Objekt oder einem Ausdruck, der einen R-Wert ergibt) , die Move-Vorlage wird wie folgt instanziiert:
// move with [T = Object]: remove_reference
Da „remove_reference
Object&& move(Object&& arg) { return static_cast
Wie erwartet wandelt die Funktion einfach ihr R-Wert-Argument in eine R-Wert-Referenz um.
Fall 2: Übergabe eines L-Werts
Jetzt das Interessante Dieser Fall tritt auf, wenn std::move() mit einem L-Wert aufgerufen wird (einer benannten Variablen oder einem Ausdruck, der einen L-Wert ergibt).
Object a; // a is lvalue Object b = std::move(a);
Dieses Mal instanziiert die Verschiebungsvorlage zu:
// move with [T = Object&] remove_reference
Remove_reference
Object&& move(Object& && arg) { return static_cast
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:
Nach diesen Regeln verhält sich Objekt& && effektiv wie Objekt& , eine gewöhnliche L-Wert-Referenz, die an L-Werte gebunden werden kann.
Daher lautet die endgültige Form der Funktion:
Object&& move(Object& arg) { return static_cast
Im Wesentlichen wandelt std::move() das L-Wert-Argument in eine R-Wert-Referenz um und ermöglicht so eine perfekte Weiterleitung unabhängig vom Eingabetyp.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3