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 const
oggetto è irragionevole, quindi perché std::move
non 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::move
fosse vietato operare su un const
oggetto, potremmo facilmente scoprire il bug, giusto?
CAT cat2 = std::move(cat);
, supponendo che CAT
supporti l'assegnazione regolare delle mosse.
std::move
è solo un cast, in realtà non muove nulla
std::move
di per sé non fa nulla per l'oggetto. Si potrebbe sostenere chestd::move
abbia un nome sbagliato.