Вы создаете временный объект и связываете его с rvalue-ссылкой в качестве возвращаемого значения, временный объект будет уничтожен сразу после полного выражения, а затем возвращаемая ссылка всегда будет зависать.
Изменение функции для возврата по значению было бы хорошо; Значение r будет перенесено в возвращаемое значение.
Foo createNewFoo()
{
return Foo();
}
Кстати: для приведенного выше кода Foo foo = createNewFoo();
не будет копировать / перемещать что-либо из-за copy elision , что гарантировано с C ++ 17.
РЕДАКТИРОВАТЬ
Так почему временное уничтожение не уничтожается сразу при возврате return Foo();
Для возврата по значению порядок возврата:
- . Построить временное
- . Переместить-построить. Возвращаемое значение из временного
- Временное уничтожается * 1027. *
Для возврата по ссылке, порядок:
- , создание временного
- , привязка временного значения к возвращаемому значению
- временное уничтожение
- возвращаемое значение (ссылка) становится зависшим