Warum heißt std::move std::move?
Trotz seines Namens funktioniert std::move(x) nicht physisch etwas bewegen. Stattdessen handelt es sich einfach um eine Umwandlung in einen R-Wert, der speziell als X-Wert bezeichnet wird. Dieser Begriff steht im Gegensatz zu prvalue, der sich auf einen Ausdruck mit einem bekannten, festen Wert bezieht.
Der Zweck dieser Namenskonvention mit std::move bestand nicht darin, irrezuführen, sondern vielmehr die Lesbarkeit des Codes zu verbessern.
Ursprünglich erforderte die Umwandlung eines L-Werts in einen R-Wert die ungewohnte Syntax von static_cast
template <class T> void swap(T& a, T& b) { T tmp(static_cast<T&&>(a)); a = static_cast<T&&>(b); b = static_cast<T&&>(tmp); }
Durch das Ersetzen von static_cast durch std::move wird der Code intuitiver und vermittelt die Absicht der Funktion, Werte zu verschieben anstatt sie zu kopieren:
template <class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); }
Durch die Verwendung von std::move können Programmierer klar erkennen, dass die Werte verschoben werden, auch wenn dies möglicherweise nicht der Fall ist Verstehen Sie die komplizierten Details von R-Werten vollständig und verschieben Sie die Semantik.
Darüber hinaus steht es Programmierern frei, ihre eigenen Funktionen oder Makros zu definieren, um Werte in R-Werte umzuwandeln, wenn sie dies bevorzugen. Beispielsweise implementiert das folgende Code-Snippet die Funktionalität von std::move unter Verwendung des Namens set_value_category_to_xvalue:
template <class T> inline constexpr auto& set_value_category_to_xvalue(T&& t) noexcept { return static_cast<std::remove_reference_t<T>&>(t); }
Letztendlich beinhaltet der generierte Objektcode für std::move zwar keine tatsächliche Bewegung, wird aber abgespielt eine wichtige Rolle bei der Kompilierung. Es ändert, welche Überladung einer Funktion aufgerufen wird, was möglicherweise zum Aufruf effizienterer Verschiebungszuweisungsoperatoren führt, die in Klassen definiert sind.
Das obige ist der detaillierte Inhalt vonWarum heißt std::move std::move, wenn es eigentlich nichts bewegt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!