Передать по значению / ссылке для параметра, который будет перемещен внутри функции - PullRequest
0 голосов
/ 23 апреля 2020

Если у вас есть параметр функции, который предназначен для перемещения в переменную внутри функции, вы бы хотели использовать передачу по ссылке вместо передачи по значению?

Например, есть ли когда-нибудь Преимущество использования

void func(T &object2move)
{
  T obj{std::move(object2move)};
}

против

void func(T object2move)
{
  T obj{std::move(object2move)};
}

В дополнение к вышесказанному, единственный случай, когда вы хотите использовать следующий код, когда вы хотите только func в значении?

void func(T object2move)
{
  T obj{object2move};
}

Зависит ли ответ на эти вопросы от того, что такое T?

1 Ответ

1 голос
/ 23 апреля 2020

Если ваша функция определенно переместится с заданного значения, то лучший способ достичь express - это взять параметр rvalue-reference (T&&). Таким образом, если пользователь попытается передать lvalue напрямую, он получит ошибку компиляции. И это заставляет их вызывать std::move непосредственно в lvalue, что заметно указывает читателю, что значение будет перемещено из.

Использование ссылки на lvalue всегда неверно. Lvalue-ссылки не привязываются к xvalues ​​и prvalues ​​(ie: выражения, из которых можно перейти от них), так что вы вроде как лжете с таким интерфейсом.

...