Maison > développement back-end > C++ > le corps du texte

Pourquoi std::move est-il appelé std::move s'il ne déplace rien ?

DDD
Libérer: 2024-11-14 19:09:02
original
532 Les gens l'ont consulté

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

Pourquoi std::move s'appelle-t-il std::move ?

Malgré son nom, std::move(x) ne fonctionne pas physiquement déplacer n'importe quoi. Au lieu de cela, il s'agit simplement d'une conversion en une valeur r, connue spécifiquement sous le nom de valeur x. Ce terme contraste avec prvalue, qui fait référence à une expression avec une valeur fixe connue.

Le but de cette convention de dénomination avec std::move n'était pas d'induire en erreur, mais plutôt d'améliorer la lisibilité du code.

À l'origine, la conversion d'une lvalue en une rvalue nécessitait la syntaxe inconnue de static_cast(a). Cet extrait de code montre comment échanger deux valeurs à l'aide de cette méthode :

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);
}
Copier après la connexion

En remplaçant static_cast par std::move, le code devient plus intuitif et transmet l'intention de la fonction, qui est de déplacer des valeurs. plutôt que de les copier :

template <class T>
void swap(T& a, T& b)
{
    T tmp(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}
Copier après la connexion

L'utilisation de std::move permet aux programmeurs de voir clairement que les valeurs sont déplacées, même s'ils ne comprennent pas complètement les détails complexes des rvalues ​​et de la sémantique de déplacement.

De plus, les programmeurs sont libres de définir leurs propres fonctions ou macros pour convertir des valeurs en rvalues ​​s'ils préfèrent. Par exemple, l'extrait de code suivant implémente la fonctionnalité de std::move en utilisant le nom 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);
}
Copier après la connexion

En fin de compte, bien que le code objet généré pour std::move n'implique aucun mouvement réel, il joue un rôle important lors de la compilation. Cela modifie la surcharge d'une fonction qui est appelée, conduisant potentiellement à l'invocation d'opérateurs d'affectation de déplacement plus efficaces définis dans les classes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal