W C ++ 11 możemy napisać taki kod:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
kiedy dzwonię std::move
, to znaczy, że chcę przesunąć obiekt, czyli zmienię obiekt. Przesuwanie const
obiektu jest nierozsądne, więc dlaczego std::move
nie ogranicza tego zachowania? To będzie pułapka w przyszłości, prawda?
Tutaj pułapka oznacza, jak wspomniał Brandon w komentarzu:
"Myślę, że ma na myśli to, że" więzi "go podstępnie podstępnie, ponieważ jeśli nie zdaje sobie sprawy, kończy się z kopią, która nie jest tym, co zamierzał."
W książce „Effective Modern C ++” Scotta Meyersa podaje przykład:
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;
};
Gdyby std::move
zabroniono nam operowania na const
obiekcie, moglibyśmy łatwo znaleźć błąd, prawda?
CAT cat2 = std::move(cat);
, zakładając, że CAT
obsługuje regularne przypisywanie ruchów.
std::move
to tylko obsada, tak naprawdę niczego nie rusza
std::move
sam w sobie nie robi nic na przedmiot. Można by argumentować, żestd::move
jest źle nazwany.