Здравствуйте, 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<<, то эта ссылка отдается туда же. И там она опять же валидна, т.к. выражение все еще не завершилось.