la cláusula 5, que describe la sintaxis de expresiones válidas, enumera para cada sintaxis de expresión las condiciones en las que la expresión es un valor l, un valor xo un valor pr. La lista completa de xvalues posibles de la cláusula 5 es:
5.2.2 párrafo 10: Una llamada a función es ... un xvalor si el tipo de resultado es una referencia rvalue al tipo de objeto.
(En el lenguaje técnico de la Norma, "Tipo de objeto" no significa lo mismo que "tipo de clase". "Tipo de objeto" incluye tipos fundamentales, punteros y matrices, y sólo excluye los tipos de función. Una referencia rvalue al tipo de función siempre se trata como un valor lvalue, no xvalue.)
Las funciones más notables que devuelven una referencia rvalue son, por supuesto, std::move
y algunas veces std::forward
.
5.2.5 párrafo 4: Si E2
es un miembro de datos no estáticos ... si E1
es un xValue, entonces E1.E2
es un xValue
(Por otra parte, un miembro de datos lookup E1->E2
es siempre un valor-i)
mismo modo, si E1
es un xValue, a continuación, la búsqueda miembro de datos E1.*E2
es un xValue:.
5.5 párrafo 6: El resultado de una expresión .*
cuyo segundo operando es un puntero a un miembro de datos tiene la misma categoría de valor (3.10) que su primer operando.
Para los diferentes tipos de moldes:
dynamic_cast<Type>(expr)
: 5.2.7 párrafo 2
static_cast<Type>(expr)
: 5.2.9 párrafo 1
reinterpret_cast<Type>(expr)
: 5.2.10 párrafo 1
const_cast<Type>(expr)
: 5.2.11 párrafo 1
(Type) expr
: 5.4 párrafo 1
la expresión es un xvalor si y solo si Type
es una referencia rvalue al tipo de objeto.Lo mismo también es cierto para , ya
5.2.3 párrafo 1: Si la lista de expresiones [paréntesis siguientes un nombre de tipo] es una sola expresión, la expresión de conversión de tipo es equivalente (en definedness, y si definido en significado) a la expresión de conversión correspondiente (5.4).
(Por otra parte, Type{expr}
es siempre una prvalue.)
Sección 5.16 en el operador condicional termina diciendo que A ? B : C
a veces puede ser un xValue si B y/o C es un xValue. Pero las reglas completas son difíciles de resumir.
Si una expresión termina llamando a una función de operador sobrecargada definida por el usuario, la sección 5.2.2 se aplica a esa expresión, no la que describe el comportamiento del operador incorporado. (Ver la expresión a + a
en el ejemplo @ James registró.)
Una respuesta completa: [¿Qué son rvalues, lvalues, xvalues, glvalues, y prvalues?] (Http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues) – pmr
Esa parte de la norma explica la comprensión general del término. No detalla cada tipo de expresión que genera un xvalor. Eso sucede en cualquier otro lugar de la norma. –
@NicolBolas: He leído esa pregunta y respuestas antes y decidí publicar otra pregunta exactamente por este motivo. – PermanentGuest