Умышленное продление времени жизни значений в именованных переменных стека, как это, бесполезно, если вы точно знаете, что происходит.Это означает, что это полезно, если вы не знаете , что именно происходит.
Скажем, вы находитесь в функции шаблона.И пользователь должен дать вам некоторый объект, который имеет get
функцию-член, которая возвращает некоторый тип, который соответствует некоторому ожидаемому поведению.Вопрос: get
возвращает ссылку или значение?
Ответ: вам все равно .Не имеет значения, возвращает ли оно значение или ссылку;важно то, что тем, что он возвращает, можно манипулировать так, как вы ожидаете.Например, вы можете ожидать, что obj.get() = 10;
сработает.
Возможно get
возвращает ссылку на объект.Или, может быть, он возвращает значение prvalue, которое является прокси-объектом, который действует как ссылка.В приведенном выше случае, возможно, он имеет перегрузку operator=
, так что вы можете назначить его.Вам, пользователю, все равно.
Итак, что произойдет, если вы захотите сохранить то, что get
возвращает в течение (короткого) периода времени?Ну, вы не хотите делать auto x = obj.get();
;если он вернул реальную ссылку, вы получите копию ссылки, которая, вероятно, не та, которую вы хотели.Итак, вы делаете auto &&x = obj.get();
.Lifetime extension позволяет работать так же хорошо с объектами proval prvalue, как и с реальными ссылками.