Да, это прекрасно работает и его поведение определено.
const auto& v = foo();
Это привязывает временную ссылку к ссылке.Срок действия временного будет продлен, чтобы соответствовать времени жизни v
.(Привязка временных ссылок к константным ссылкам поддерживалась в C ++ 03 даже до того, как ссылки на rvalue стали чем-то особенным.)
const auto& v2 = v;
Это просто принимает другую ссылку на тот же объект.Это в основном неоперация, которая будет устранена во время компиляцииПока v2
не переживает v
(что в данном случае не происходит), проблем не будет.