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 constobjeto não é razoável, então por que std::movenã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::movefosse proibido de operar em um constobjeto, poderíamos facilmente descobrir o bug, certo?
CAT cat2 = std::move(cat);, supondo que CATsuporte atribuição de movimento regular.
std::moveé apenas um elenco, na verdade não move nada
std::movepor si só não faz nada para o objeto. Alguém poderia argumentar questd::moveé mal nomeado.