std::move() und die Konvertierung von Ausdrücken in R-Werte
std::move() ist eine leistungsstarke Funktion in C, die ermöglicht es Ihnen, Objekte von einem Ort an einen anderen zu verschieben, ohne sie zu kopieren. Das Verständnis seiner Implementierung kann eine Herausforderung sein, aber es ist wichtig, seine Fähigkeiten zu erkennen.
Implementierungsdetails
Die Implementierung von std::move() in der MSVC-Standardbibliothek verwendet die Vorlage std::remove_reference zum Konvertieren von Ausdrücken in R-Werte. So funktioniert es:
template<class _Ty> inline typename tr1::_Remove_reference< _Ty >:: _Type& && move( _Ty && _Arg ) { return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg); }
Bindung an L-Werte
Wenn Sie einen L-Wert an std::move() übergeben, wird der Referenzparameter _Arg an den L-Wert gebunden . Sie können eine R-Wert-Referenz jedoch nicht direkt an einen L-Wert binden. Um dieses Problem zu beheben, wandelt die Implementierung den L-Wert mit std::static_cast in eine R-Wert-Referenz um.
Std::remove_reference verstehen
std::remove_reference wird zum Entfernen verwendet Referenzen von Typen. Hier ist die Implementierung:
template<class _Ty> struct _Remove_reference { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty && > { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty &&&&> { typedef _Ty _Type };
Verwendung mit R-Werten
Wenn std::move() mit einem R-Wert aufgerufen wird, konvertiert std::remove_reference T&& in T, Dies führt zu der folgenden Instanziierung der Funktionsvorlage:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
Die Umwandlung ist erforderlich, da sie benannt ist R-Wert-Referenzen werden als L-Werte behandelt.
Verwendung mit L-Werten
Wenn std::move() mit einem L-Wert aufgerufen wird, konvertiert std::remove_reference T& in T, Dies führt zu der folgenden Instanziierung der Funktionsvorlage:
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
Referenz-Reduzierungsregeln Die vom C 11-Standard bereitgestellten Funktionen ermöglichen die Bindung von Object& && an L-Werte. Die resultierende Funktion wandelt das L-Wert-Argument effektiv in eine R-Wert-Referenz um.
Fazit
std::move() nutzt std::remove_reference und Referenz-Reduzierungsregeln, um das zu ermöglichen Konvertierung von L-Werten und R-Werten in R-Wert-Referenzen. Dies ermöglicht eine effiziente Objektbewegung und eine Optimierung der Speichernutzung.
Das obige ist der detaillierte Inhalt vonWie konvertiert „std::move()' Ausdrücke in R-Werte in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!