2011-05-28 16 views
13

@FredOverflow mentioned in the C++ chatroom que this es un caso raro de rvalues ​​que tienen nombres. El C++ 0x FDIS menciona bajo 5.1.1 [expr.prim.general] p4:¿Qué valores tienen nombres?

De lo contrario, si un miembro-declarador declara un miembro de datos no estático (9.2) de una clase X, la expresión this es un prvalue de tipo “puntero a X " dentro del inicializador de llave o igual opcional. No aparecerá en ninguna otra parte del miembro declarador. (énfasis mío)

¿Qué más hay, si hay alguno?

+4

Técnicamente, 'this',' true', y 'false' no son nombres. Son tokens que forman expresiones rvalue válidas y que parecen ser identificadores. – aschepler

Respuesta

8

un caso prominente son enumeradores

enum arity { one, two }; 

Las expresiones one y two son valores r (más específicamente, prvalues ​​en C++ 0x). Otra son los parámetros de plantilla no tipo

template<int *P> struct A { }; 

La expresión P es un rvalue demasiado (más específicamente de nuevo, un prvalue en C++ 0x).

+0

Cotizaciones estándar para respaldar esto? (Sé que tienes uno, ¡no me lo ocultes! ':)') – Xeo

+0

@Xeo Está en 5.1.1p8 y 14.1p6 –

8
  1. Los literales booleanos true y false son prvalues ​​de tipo bool.
  2. nullptr es un prvalue de tipo nullptr_t.
  3. Cuando devuelve una variable con nombre de una función, se convierte en xvalue en el contexto de esa expresión, y xvalue es rvalue (por §3.10/1).

Puede haber más, pero esos son todo lo que puedo pensar en este momento (y el tercero es cuestionable - es realmente la expresión que es la xValue, pero con algo como return x; (donde x es una variable local y está devolviendo el valor, no una referencia), el nombre de la variable es la expresión. El nombre realmente se refiere a un glvalue, y en la expresión ese valor (pero no realmente el nombre) se convierte a un valor x (que es un valor p).

+1

D'oh! 'true' y' false', por supuesto! – Xeo

+0

El tercer punto solo se aplica a las variables locales devueltas por valor. Y aun así la expresión sigue siendo un valor l, pero hay una regla de lenguaje especial que trata el objeto * como si * fuera designado por un valor r. – fredoverflow

+0

@FredOverflow: sí, edité mencionando que tenía que ser local para que se aplicara algo de esto (y como dije, acepto que el tercero es cuestionable de todos modos). –

Cuestiones relacionadas