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&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); }
Lassen Sie uns zeigen, wie das funktioniert:
Object obj1; Object obj2 = std::move(obj1); // _Ty&& _Arg binds to obj1
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&> { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&&> { // remove rvalue reference typedef _Ty _Type; };
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&& move(Object& arg) { return static_cast<Object&&>(arg); }
Zur weiteren Erläuterung:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
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.
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
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!