25 votes

Est-ce que std::move devrait supprimer la constance?

Le code suivant compile et s'exécute sur MSVC2010, devrait-il?

const std::string s = "foo";
std::string s2(std::move(s));

Je comprends pourquoi cela ne devrait probablement pas causer de problème, car si je prends les éléments internes de s, je dois savoir que personne ne va l'utiliser, donc peu importe que je supprime const. Cependant, que se passe-t-il lorsque le compilateur implémente des objets const dans la ROM (dans une application embarquée) ? La commande move se transformera-t-elle en une copie alors ? Ou est-ce que MSVC devrait me donner une erreur ?

30voto

sehe Points 123151

Je pense que std::move(T const&) renvoie simplement T const &&. Cela signifie qu'il ne sera en fait pas déplacé (car les opérateurs / constructeurs de déplacement ne correspondent pas au type de paramètre).

Ce qui se passe, c'est que le constructeur prenant T const& correspond à la lvalue (la variable avec le type T const &&) et en conséquence, le déplacement se dégrade en une copie.

23voto

Puppy Points 90818

Il n'y a pas de différence pour

const std::string f() { return "foo"; }
std::string s2 = f();

Cela était, à un moment donné, recommandé en C++03, et le Comité n'a pas cassé ce code en introduisant les références rvalue. Il se dégrade simplement en une copie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X