Семантика перемещения основана на ссылках rvalue . Rvalue - временный объект, который будет уничтожен в конце выражения. В текущем C ++ значения r привязаны только к const
ссылкам. C ++ 1x позволит ссылаться на ссылки не на const
rvalue, записанные T&&
, которые являются ссылками на объекты rvalue. Так как rvalue будет умирать в конце выражения, вы можете украсть его данные . Вместо того, чтобы копировать в другой объект, вы переместите свои данные в него.
class X {
public:
X(X&& rhs) // ctor taking an rvalue reference, so-called move-ctor
: data_()
{
// since 'x' is an rvalue object, we can steal its data
this->swap(std::move(rhs));
// this will leave rhs with the empty data
}
void swap(X&& rhs);
// ...
};
// ...
X f();
X x = f(); // f() returns result as rvalue, so this calls move-ctor
В приведенном выше коде со старыми компиляторами результат f()
был скопирован в x
с помощью конструктора копий X
. Если ваш компилятор поддерживает перемещение семантики, а X
имеет конструктор move, то вместо этого вызывается. Поскольку аргумент rhs
является rvalue , мы знаем, что он больше не нужен, и мы можем украсть его значение. Таким образом, значение перемещено из неназванного временного объекта, возвращенного с f()
в x
(в то время как данные x
, инициализированные до пустого X
, перемещаются во временное, что будет уничтожить после назначения).