Heim > Backend-Entwicklung > C++ > Wie behandelt std::move() L-Werte in C?

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

Mary-Kate Olsen
Freigeben: 2024-11-14 14:46:02
Original
415 Leute haben es durchsucht

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 Funktionsvorlage „Verschieben“:

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{ return static_cast<typename remove_reference<T>::type&&>(arg); }
Nach dem Login kopieren

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); }
Nach dem Login kopieren

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

Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Nach dem Login kopieren

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);
Nach dem Login kopieren

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); }
Nach dem Login kopieren

Nochmals: „remove_reference“ konvertiert Object& in Object, was zu Folgendem führt:

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Nach dem Login kopieren

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:

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

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); }
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage