„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie behandelt std::move() L-Werte in C++?

Wie behandelt std::move() L-Werte in C++?

Veröffentlicht am 13.11.2024
Durchsuche:516

How Does std::move() Handle Lvalues in C  ?

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:

template 
typename 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::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

Da „remove_reference“ ein Objekt in ein Objekt konvertiert, erhalten wir Folgendes:

Object&& move(Object&& arg) { return static_cast(arg); }

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::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

Remove_reference konvertiert Object& in Object, was zu Folgendem führt:

Object&& move(Object& && arg) { return static_cast(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:

  • Object & & = Object &
  • Object & & && = Objekt &
  • Objekt & && & = Objekt &
  • Objekt & && & && = Objekt & &&

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(arg); }

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.

Neuestes Tutorial Mehr>

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