пунктом 5, в котором описывается синтаксис действительных выражений, списки для каждого синтаксиса выражения - условия, в которых выражение является значением lvalue, значением x или значением prvalue. Полный список возможных значений x из пункта 5:
5.2.2 параграф 10: вызов функции является ... значением xvalue, если тип результата является ссылкой rvalue на тип объекта.
(В техническом языке Стандарта, «тип объекта» не означает то же самое, как «класс типа». «Тип объекта» включает в себя основные типы, указатели и массивы, и исключает только типы функций. Ссылка rvalue на тип функции всегда обрабатывается как lvalue, а не xvalue.)
Наиболее заметными функциями, которые возвращают ссылку на rvalue, являются, конечно, std::move
, а иногда и std::forward
.
5.2.5 пункта 4: Если E2
не является статическим членом данных ... если E1
является xvalue, то E1.E2
является xvalue
(С другой стороны, член данных поиск E1->E2
всегда именующий)
Аналогичен, если E1
является xvalue, то поиск члена данных E1.*E2
является xvalue:.
5.5 параграф 6: результат выражения .*
, второй операнд которого является указателем на элемент данных, имеет такую же категорию значений (3.10), что и его первый операнд.
Для различных типов отливок:
dynamic_cast<Type>(expr)
: 5.2.7 пункта 2
static_cast<Type>(expr)
: 5.2.9 пункт 1
reinterpret_cast<Type>(expr)
: пункт 5.2.10 1
const_cast<Type>(expr)
: 5.2.11, пункт 1
(Type) expr
: 5.4 параграф 1
выражение является значением xvalue тогда и только тогда, когда Type
является ссылкой rvalue на тип объекта.То же самое верно и для , поскольку в пункте 1
5.2.3: Если список выражений [в скобках после имени типа] является одно выражение, выражение преобразования типа эквивалентно (в определенность, и если определенный по смыслу) соответствующему литовому выражению (5.4).
(С другой стороны, Type{expr}
всегда prvalue.)
Раздел 5.16 на условный оператор заканчивает говорить, что A ? B : C
иногда может быть xvalue, если В и/или С является xvalue. Но полные правила трудно подвести итогами.
Если выражение заканчивается вызовом пользовательской перегруженной операторской функции, то к этому выражению применяется раздел 5.2.2, а не тот, который описывает поведение встроенного оператора. (См выражение a + a
в примере @James вывешенным.)
Полный ответ: [Что такое rvalues, lvalues, xvalues, glvalues и prvalues?] (Http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues) – pmr
Эта часть стандарта объясняет общее понимание термина. Он не детализирует все выражения, генерирующие xvalue. Это происходит в другом месте стандарта. –
@NicolBolas: Я прочитал этот вопрос и ответы раньше, и я решил отправить другой вопрос именно по этой причине. – PermanentGuest