Heim > Backend-Entwicklung > C++ > Hauptteil

Warum heißt std::move std::move, wenn es eigentlich nichts bewegt?

DDD
Freigeben: 2024-11-14 19:09:02
Original
531 Leute haben es durchsucht

Why is std::move called std::move if it doesn't actually move anything?

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(a). Dieser Codeausschnitt zeigt, wie zwei Werte mit dieser Methode ausgetauscht werden:

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

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage