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 constobjeto no es razonable, entonces, ¿por qué std::moveno 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::moveestuviera prohibido operar en un constobjeto, podríamos descubrir fácilmente el error, ¿verdad?
CAT cat2 = std::move(cat);, asumiendo que CATadmite la asignación de movimiento regular.
std::movees solo un yeso, en realidad no mueve nada
std::movepor sí solo no le hace nada al objeto. Se podría argumentar questd::moveestá mal nombrado.