En C ++ 11, nous pouvons écrire ce code:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
quand j'appelle std::move
, cela signifie que je veux déplacer l'objet, c'est-à-dire que je vais changer l'objet. Déplacer un const
objet n'est pas raisonnable, alors pourquoi ne std::move
restreint-il pas ce comportement? Ce sera un piège dans le futur, non?
Ici, piège signifie comme Brandon l'a mentionné dans le commentaire:
"Je pense qu'il veut dire qu'il" le piège "sournoisement parce que s'il ne réalise pas, il finit avec une copie qui n'est pas ce qu'il voulait."
Dans le livre 'Effective Modern C ++' de Scott Meyers, il donne un exemple:
class Annotation {
public:
explicit Annotation(const std::string text)
: value(std::move(text)) //here we want to call string(string&&),
//but because text is const,
//the return type of std::move(text) is const std::string&&
//so we actually called string(const string&)
//it is a bug which is very hard to find out
private:
std::string value;
};
S'il std::move
était interdit d'opérer sur un const
objet, nous pourrions facilement trouver le bogue, non?
CAT cat2 = std::move(cat);
, en supposant qu'il CAT
prend en charge l'assignation de déplacement régulière.
std::move
est juste un casting, il ne bouge en fait rien
std::move
par lui-même ne fait rien à l'objet. On pourrait dire qu'ilstd::move
est mal nommé.