Информация об изменениях

Сообщение Re[5]: зауженное расширение времени жизни от 10.11.2019 23:11

Изменено 10.11.2019 23:21 rg45

Re[5]: зауженное расширение времени жизни
Здравствуйте, Molchalnik, Вы писали:

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

Re[5]: зауженное расширение времени жизни
Здравствуйте, Molchalnik, Вы писали:

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