Maison >développement back-end >C++ >Pourquoi « std :: move » est-il appelé « std :: move » s'il ne bouge rien ?

Pourquoi « std :: move » est-il appelé « std :: move » s'il ne bouge rien ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-20 04:40:02941parcourir

Why is `std::move` Called `std::move` if it Doesn't Move Anything?

Pourquoi std::move est-il nommé std::move ?

Contrairement à son nom, std::move ne déplace physiquement rien ; au lieu de cela, il convertit l'objet en une référence rvalue ou, plus précisément, une xvalue. La décision de nommer la fonction move n'était pas pour tromper ou confondre mais pour rendre le code plus lisible.

Dans les premiers stades des références rvalue, la fonction std::swap devait être optimisée pour les performances. La méthode originale utilisait static_cast expressions, qui obscurcissaient l'objectif sous-jacent du code.

En introduisant std::move, les conversions explicites ont été remplacées par du sucre syntaxique qui mettait l'accent sur l'intention du code : activer la sémantique de déplacement. Expliquer les détails techniques précis, tels que « cast to rvalue », aurait soulevé des questions supplémentaires, obscurcissant le point principal.

L'histoire de std::move

L'histoire de std:: move remonte à la proposition de références rvalue en 2002. La fonction move a été initialement introduite comme sucre de syntaxe pour static_cast, étant entendu que peu de programmeurs à l'époque comprenaient pleinement le lien entre les rvalues ​​et la sémantique de déplacement.

Au fur et à mesure de l'évolution du langage C, le concept de valeurs a été affiné pour devenir ce que nous appelons aujourd'hui les catégories de valeurs. Utiliser un nom différent, tel que cast_to_xvalue, pour décrire plus précisément l'opération aurait pu gêner la lisibilité.

Ce que std::move fait

À la base, std::move convertit simplement un objet à une valeur x. Cette conversion n'a aucun impact sur les objets trivialement mobiles, et pour les objets avec des opérateurs d'affectation de déplacement, elle garantit que l'opérateur d'affectation de déplacement est appelé à la place de l'opérateur d'affectation de copie.

En termes de code objet généré, std : move n'a aucun impact sur les objets trivialement mobiles. Pour les objets avec des opérateurs d'affectation de déplacement, cela peut modifier la résolution de surcharge. Cependant, au moment de l'exécution, std::move disparaît effectivement et son seul impact se situe au moment de la compilation.

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!

Déclaration:
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