История изменений
Исправление 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).