@krot0glot

Как понять rvalue ссылки? Когда использовать std::move, а когда std::forward?

Сейчас читаю Скотта Маерса "Современный и эффективный С++" и не совсем понимаю его ход мыслей, можно сказать, что и половины не понимаю. Может знаете, где можно почитать про это с более ясным изложением?
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Я их называю «врéменные ссылки» — то есть ссылки на временный безымянный объект, возникший в процессе вычисления значения выражения. Отличается тем, что обычно ссылки на временные объекты принимают заоптимизированные деструктивные функции, которые этот объект готовы выпотрошить в своих целях.

Функция move предназначена для превращения ссылки (именованной или временной) во временную. Например, чтобы сказать: это именованный объект, но спокойно потрошите его, мне он не нужен.

У Си++ есть одна фишка:
void bar(std::string&& x) {}

void foo(std::string&& x) {
  bar(std::move(x));
}

int main() {
  std::string x = "Test";
  foo (std::move(x));
  return 0;
}

То есть снаружи foo требует временную ссылку. Но внутри эта ссылка для ошибкобезопасности обычная именованная! В данном случае, когда функция нешаблонная, мы можем поставить move, но что делать в шаблоне?

Автоопределение типов тут пасует, потому приходится так.
template <class T>
void foo(T&& x) {
  bar(std::forward<T>(x));
}

Да, я написал «ошибкобезопасность», хотя функция типа усложняет код. Дело в том, что потеря данных всегда хуже, чем неоптимальный код.

Таким образом, move — это превращение ссылки (обычной или временной) во временную. Что-то вроде: «Потрошите этот объект спокойно, он мне не нужен».

Forward — это прикидка, по какой ссылке (обычной или временной) мы передавали объект в функцию, и передача по цепочке таким же образом. Используется только в шаблонах.

Вот моё описание всего этого.
https://mercury13-kiev.livejournal.com/96961.html
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы