En C ++ 11, podemos escribir este código:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
cuando llamo std::move
, significa que quiero mover el objeto, es decir, cambiaré el objeto. Mover un const
objeto no es razonable, entonces, ¿por qué std::move
no restringe este comportamiento? Será una trampa en el futuro, ¿verdad?
Aquí trampa significa como Brandon mencionó en el comentario:
"Creo que lo que quiere decir es que lo" atrapa "furtivamente, porque si no se da cuenta, termina con una copia que no es lo que pretendía".
En el libro 'Effective Modern C ++' de Scott Meyers, da un ejemplo:
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;
};
Si std::move
estuviera prohibido operar en un const
objeto, podríamos descubrir fácilmente el error, ¿verdad?
CAT cat2 = std::move(cat);
, asumiendo que CAT
admite la asignación de movimiento regular.
std::move
es solo un yeso, en realidad no mueve nada
std::move
por sí solo no le hace nada al objeto. Se podría argumentar questd::move
está mal nombrado.