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 constobjet n'est pas raisonnable, alors pourquoi ne std::moverestreint-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 constobjet, nous pourrions facilement trouver le bogue, non?
CAT cat2 = std::move(cat);, en supposant qu'il CATprend en charge l'assignation de déplacement régulière.
std::moveest juste un casting, il ne bouge en fait rien
std::movepar lui-même ne fait rien à l'objet. On pourrait dire qu'ilstd::moveest mal nommé.