В 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
, погано названий.