In C ++ 11 possiamo scrivere questo codice:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
quando chiamo std::move, significa che voglio spostare l'oggetto, cioè cambierò l'oggetto. Spostare un constoggetto è irragionevole, quindi perché std::movenon limitare questo comportamento? Sarà una trappola in futuro, giusto?
Qui trap significa come Brandon ha menzionato nel commento:
"Penso che voglia dire che" intrappola "lui subdolo subdolo perché se non si rende conto, finisce con una copia che non è quello che intendeva."
Nel libro "Effective Modern C ++" di Scott Meyers, fornisce un esempio:
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 vietato operare su un constoggetto, potremmo facilmente scoprire il bug, giusto?
CAT cat2 = std::move(cat);, supponendo che CATsupporti l'assegnazione regolare delle mosse.
std::moveè solo un cast, in realtà non muove nulla
std::movedi per sé non fa nulla per l'oggetto. Si potrebbe sostenere chestd::moveabbia un nome sbagliato.