Сообщение Re[7]: && member? от 11.09.2021 8:38
Изменено 11.09.2021 8:42 rg45
Re[7]: && member?
Здравствуйте, Marty, Вы писали:
R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Подробнее можно почитать здесь: https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary.
То есть, при выходе из функции время жизни временного объекта заканчивается в любом случае. И образуется "висячая" ссылка. И даже использование copy/move elision от этого не спасает.
R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Подробнее можно почитать здесь: https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary.
А temporary bound to a return value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such return statement always returns a dangling reference.
То есть, при выходе из функции время жизни временного объекта заканчивается в любом случае. И образуется "висячая" ссылка. И даже использование copy/move elision от этого не спасает.
Re[7]: && member?
Здравствуйте, Marty, Вы писали:
R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Подробнее можно почитать здесь: https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary.
То есть, при выходе из функции время жизни временного объекта заканчивается в любом случае. И образуется "висячая" ссылка. И даже использование copy/move elision от этого не спасает.
P.S. В принципе, происходит та же самая фигня, что и при попытке вернуть из функции std::initializer_list. Недавно вот обсуждали: http://rsdn.org/forum/cpp/8076574.1
R>>А этот код демонстрирует сценарий, когда продление времени жизни временного объекта не работает. Образование невалидной rvalue ссылки и неопределенное поведение, вызванное ее использованием.
M>Сорян за затупанство, но можно поподробнее, что на каждом шаге происходит?
Подробнее можно почитать здесь: https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary.
А temporary bound to a return value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such return statement always returns a dangling reference.
То есть, при выходе из функции время жизни временного объекта заканчивается в любом случае. И образуется "висячая" ссылка. И даже использование copy/move elision от этого не спасает.
P.S. В принципе, происходит та же самая фигня, что и при попытке вернуть из функции std::initializer_list. Недавно вот обсуждали: http://rsdn.org/forum/cpp/8076574.1
Автор: vng
Дата: 22.08.21
Дата: 22.08.21