Em C ++ 11, podemos escrever este código:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
quando eu chamo std::move
, significa que quero mover o objeto, ou seja, vou mudar o objeto. Mover um const
objeto não é razoável, então por que std::move
não restringe esse comportamento? Vai ser uma armadilha no futuro, certo?
Aqui, armadilha significa como Brandon mencionou no comentário:
"Eu acho que ele quis dizer isso" uma armadilha "sorrateiramente, porque se ele não perceber, ele acaba com uma cópia que não é o que ele pretendia."
No livro 'Effective Modern C ++' de Scott Meyers, ele dá um exemplo:
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;
};
Se std::move
fosse proibido de operar em um const
objeto, poderíamos facilmente descobrir o bug, certo?
CAT cat2 = std::move(cat);
, supondo que CAT
suporte atribuição de movimento regular.
std::move
é apenas um elenco, na verdade não move nada
std::move
por si só não faz nada para o objeto. Alguém poderia argumentar questd::move
é mal nomeado.