LINUX.ORG.RU

История изменений

Исправление utf8nowhere, (текущая версия) :

Продление жизни rvalue

Опять 25... У rvalue нет (времени) жизни, это класс выражений. Время жизни есть у объектов.

S &&s = static_cast<S>(Q), при наличии у Q operator S() - так делать нельзя? Бредом попахивает, но к чему эти слов про user-defined conversion.

Я думаю, ты пропустил скобки после Q: S &&s = static_cast<S>(Q{}).

В процитированном тобой написано про каст glvalue operand to a glvalue. Каст к не-ссылке это не glvalue, а prvalue:

http://eel.is/c++draft/expr.static.cast#1.sentence-2

If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; if T is an rvalue reference to object type, the result is an xvalue; otherwise, the result is a prvalue.

Это prvalue при инициализации ссылки материализуется (http://eel.is/c draft/conv.rval) и время жизни созданного объекта продлевается согласно первого подпункта («a temporary materialization conversion»).

Исходная версия utf8nowhere, :

Продление жизни rvalue

Опять 25... У rvalue нет (времени) жизни, это класс выражений. Время жизни есть у объектов.

S &&s = static_cast<S>(Q), при наличии у Q operator S() - так делать нельзя? Бредом попахивает, но к чему эти слов про user-defined conversion.

Я думаю, ты пропустил скобки после Q: S &&s = static_cast<S>(Q{}).

Там написано про каст glvalue operand to a glvalue. Каст к не-ссылке это не glvalue, а prvalue:

http://eel.is/c++draft/expr.static.cast#1.sentence-2

If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; if T is an rvalue reference to object type, the result is an xvalue; otherwise, the result is a prvalue.

Это prvalue при инициализации ссылки материализуется (http://eel.is/c draft/conv.rval) и время жизни созданного объекта продлевается согласно первого подпункта (http://eel.is/c draft/class.temporary#6.1).