В C ++ 11 мы можем написать такой код:
struct Cat {
Cat(){}
};
const Cat cat;
std::move(cat); //this is valid in C++11
когда я звоню std::move, это означает, что я хочу переместить объект, т.е. я изменю объект. Перемещать constобъект нецелесообразно, так почему бы std::moveне ограничить такое поведение? В будущем это будет ловушка, верно?
Здесь ловушка означает, как Брэндон упомянул в комментарии:
«Я думаю, он имел в виду, что это« ловушка »его подлый подлый, потому что, если он не осознает, он заканчивает с копией, которая не то, что он намеревался».
В книге Скотта Мейерса «Эффективный современный C ++» он приводит пример:
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;
};
Если бы std::moveбыло запрещено работать с constобъектом, мы могли бы легко обнаружить ошибку, верно?
CAT cat2 = std::move(cat);, предполагая, что CATподдерживает регулярное присвоение перемещений.
std::moveэто всего лишь гипс, он на самом деле ничего не двигает
std::moveсам по себе ничего не делает с объектом. Можно поспоритьstd::move, плохо назван.