Там есть семантическая разница.Когда вы возвращаете объект, как в
A test1()
{
return std::move(m_a);
}
std::unique_ptr<int> test3()
{
return std::move(m_sp);
}
, вы всегда выходите из своего члена.Независимо от того, делает ли вызывающий объект что-то с возвращаемым значением или нет, вы переместитесь из вашего X
во временное.Владение больше не принадлежит вам.Вызывающий может принять возвращаемое значение.Если вызывающая сторона игнорирует возвращаемое значение, временное будет все равно уничтожено.Если вы возвращаете rvalue-ссылку, с другой стороны, как в
A&& test2()
{
return std::move(m_a);
}
std::unique_ptr<int>&& test4()
{
return std::move(m_sp);
}
, вы просто предлагаете вызывающей стороне возможность перейти от / взять на себя владение объектом.Если вызывающая сторона не выполняет перемещение, ваш X
сохранит право собственности, объект не будет перемещен.
Важно понять, что вопреки тому, что следует из названия, std::move()
делаетна самом деле не выполнять ход.Это просто позволяет перемещать данный объект.Фактическое перемещение выполняется конструктором перемещения или оператором присваивания перемещения соответствующего типа.
Итак, ваш ответ: это зависит от того, что вы хотите выразить.Если вы возвращаете объект, вы говорите: «Я выбрасываю это, если вы хотите: оно там».Если вы возвращаете ссылку на rvalue, вы говорите: «Это то, что есть, теперь у вас есть шанс воспользоваться этим, иначе я оставлю это»…