Сообщение Re[5]: зауженное расширение времени жизни от 10.11.2019 23:11
Изменено 10.11.2019 23:21 rg45
R>>
R>>The lifetime of a temporary bound to the returned value in a function return statement ([stmt.return]) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.
M>спасибо! Но есть ещё утверждение автора примера о том, что у rvalue не возможно расширить время жизни, только скопировать. Если на 6.11 я ещё натыкался, то вот про rvalue я вообще ничего не нашёл.
Я думаю, здесь имеет место какое-то не совсем верное толкование его высказываний. Во-первых, заметно некоторое размытие терминологии: в контескте обсуждения продления времени жизни речь идет всегда о времени жизни временных объектов. Которые материализуются как раз при биндинге ссылок именно к rvalue выражениям (prvalue, если быть точным):
https://timsong-cpp.github.io/cppwp/class.temporary#2
The materialization of a temporary object is generally delayed as long as possible in order to avoid creating unnecessary temporary objects. [
Note: Temporary objects are materialized:
— when binding a reference to a prvalue
— . . .
А во-вторых, важным является то, что (какая-то) ссылка биндится к временному объекту, какая именно это ссылка, совсем не важно. Поэтому rvalue ссылка способна продлевать время жизни временного объекта с тем же успехом, что и константная lvalue. И в этой же главе можно найти приеры этого:
https://timsong-cpp.github.io/cppwp/class.temporary#6
template<typename T> using id = T; int i = 1; int&& a = id<int[3]>{1, 2, 3}[i]; // temporary array has same lifetime as a const int& b = static_cast<const int&>(0); // temporary int has same lifetime as b int&& c = cond ? id<int[3]>{1, 2, 3}[i] : static_cast<int&&>(0); // exactly one of the two temporaries is lifetime-extended
R>>
R>>The lifetime of a temporary bound to the returned value in a function return statement ([stmt.return]) is not extended; the temporary is destroyed at the end of the full-expression in the return statement.
M>спасибо! Но есть ещё утверждение автора примера о том, что у rvalue не возможно расширить время жизни, только скопировать. Если на 6.11 я ещё натыкался, то вот про rvalue я вообще ничего не нашёл.
Я думаю, здесь имеет место какое-то не совсем верное толкование его высказываний. Во-первых, заметно некоторое размытие терминологии: в контескте обсуждения продления времени жизни речь идет всегда о времени жизни временных объектов. Которые материализуются как раз при биндинге ссылок именно к rvalue выражениям (prvalue, если быть точным):
https://timsong-cpp.github.io/cppwp/class.temporary#2
The materialization of a temporary object is generally delayed as long as possible in order to avoid creating unnecessary temporary objects. [
Note: Temporary objects are materialized:
— when binding a reference to a prvalue
— . . .
А во-вторых, важным является то, что (какая-то) ссылка биндится к временному объекту, какая именно это ссылка (rvalue или lvalue), совсем не важно. Поэтому rvalue ссылка способна продлевать время жизни временного объекта с тем же успехом, что и константная lvalue ссылка. И в этой же главе можно найти примеры:
https://timsong-cpp.github.io/cppwp/class.temporary#6
template<typename T> using id = T; int i = 1; int&& a = id<int[3]>{1, 2, 3}[i]; // temporary array has same lifetime as a const int& b = static_cast<const int&>(0); // temporary int has same lifetime as b int&& c = cond ? id<int[3]>{1, 2, 3}[i] : static_cast<int&&>(0); // exactly one of the two temporaries is lifetime-extended