Re[3]: MSVC: A non-const reference may only be bound to an lvalue
От: so5team https://stiffstream.com
Дата: 26.07.23 10:07
Оценка:
Здравствуйте, Sm0ke, Вы писали:

S>Разве это не приведёт к dangling reference? Параметр функции всё равно что локальная переменная.


Не думаю. "Все равно что локальная переменная" -- это когда у нас параметр передается по значению, т.е.:
int & f(int a) {
  return a;
}

В случае же когда параметр передается по ссылке, мы просто возвращаем эту же самую ссылку и на нее действуют обычные правила жизни.

Когда мы имеем дело с rvalue reference, то rvalue reference должно оставаться валидным в течении жизни выражения, в котором эта ссылка появилась. Т.е.:
T && operator<<(T && d, int v) { ...; return std::move(d); }

(T{} << 0) << 1;

сперва у нас создается временный объект T и rvalue reference на него передается в первый вызов operator<<. Он эту же самую ссылку возвращает. И эта ссылка остается валидной, т.к. выражение у нас не завершилось. Когда вызывается второй operator<<, то эта ссылка отдается туда же. И там она опять же валидна, т.к. выражение все еще не завершилось.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.