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