Heim > Backend-Entwicklung > C++ > Wie erreicht „std::move()' die Konvertierung von L-Werten in R-Werte in C?

Wie erreicht „std::move()' die Konvertierung von L-Werten in R-Werte in C?

Linda Hamilton
Freigeben: 2024-11-21 08:14:09
Original
497 Leute haben es durchsucht

How does `std::move()` achieve the conversion of lvalues to rvalues in C  ?

Wie transformiert std::move Ausdrücke in R-Werte?

std::move() erleichtert die Konvertierung von Ausdrücken in R-Werte (rechts Wertreferenzen), um die Verschiebungssemantik zu ermöglichen. Allerdings kann die Implementierung in der MSVC-Standardbibliothek verwirrend sein.

Die Implementierung ist wie folgt:

template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;
move(_Ty&amp;&amp; _Arg)
{ // forward _Arg as movable
    return ((typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;)_Arg);
}
Nach dem Login kopieren

Lassen Sie uns zeigen, wie das funktioniert:

Object obj1;
Object obj2 = std::move(obj1); // _Ty&amp;&amp; _Arg binds to obj1
Nach dem Login kopieren

Upon Beim Aufruf von std::move() wird der Referenzparameter _Arg an den L-Wert obj1 gebunden. Da das Binden einer R-Wert-Referenz an einen L-Wert jedoch nicht direkt zulässig ist, könnte man davon ausgehen, dass eine Umwandlung in eine R-Wert-Referenz wie (Object&&) erforderlich ist.

Weitere Einblicke in die Implementierung von std:: „remove_reference“ klärt die Sache:

template<class _Ty>
struct _Remove_reference
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;>
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;&amp;>
{ // remove rvalue reference
    typedef _Ty _Type;
};
Nach dem Login kopieren

Diese Implementierung zeigt, dass „remove_reference“ T& in T, T&& in T und umwandelt T&&& in T. Daher wird für unseren Fall, in dem obj1 ein L-Wert vom Typ Object ist, die resultierende Funktion zu:

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

Zur weiteren Erläuterung:

  • Wenn move aufgerufen wird Mit einem R-Wert (z. B. std::move(Object())) wird T zum Objekt und zur resultierenden Funktion ist:
Object&amp;&amp; move(Object&amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
Nach dem Login kopieren

Die Umwandlung in Object&& ist notwendig, da benannte R-Wert-Referenzen als L-Werte behandelt werden, während eine implizite Konvertierung von L-Wert in R-Wert-Referenz nicht zulässig ist.

  • Wann move wird mit einem L-Wert aufgerufen, wie in unserem vorherigen Beispiel, T wird zu Object& und der resultierenden Funktion ist:
Object&amp;&amp; move(Object&amp; &amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
Nach dem Login kopieren

Hier kommen die Referenz-Reduzierungsregeln von C 11 ins Spiel und ermöglichen die Interpretation des Ausdrucks Object& && als Object&, eine L-Wert-Referenz, die tatsächlich an L-Werte binden kann. Somit wandelt die letzte Funktion ihr Argument in eine R-Wert-Referenz um und gibt sie zurück.

Zusammenfassend lässt sich sagen, dass std::move() std::remove_reference verwendet, um die Umwandlung von L-Werten und R-Werten in R-Werte zu ermöglichen und so das Verschieben zu erleichtern Semantik in C .

Das obige ist der detaillierte Inhalt vonWie erreicht „std::move()' die Konvertierung von L-Werten in R-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