(motivada por an answer.)¿Qué es decltype (0 + 0)?
Dada N3290, §7.1.6.2p4, donde los elementos de la lista no están numeradas, pero contados aquí para nuestra conveniencia:
El tipo denotado por decltype (e) se define como sigue:
- si e es un id-expresión unparenthesized o un unparenthesized acceso miembro de la clase (5.2.5), decltype (e) es el tipo de la entidad nombrada por e. Si no existe tal entidad, o si e nombra un conjunto de funciones sobrecargadas, el programa está mal formado;
- de otro modo, si E es un xValue, decltype (e) es T & &, donde T es el tipo de e;
- de lo contrario, si e es un lvalue, decltype (e) es T &, donde T es el tipo de e;
- de lo contrario, decltype (e) es el tipo de e.
¿Cuál es el tipo especificado por decltype (0 + 0)?
El elemento 1 no se aplica, 2 podría, pero si no, entonces 3 no se aplica y 4 sería el resultado. Entonces, ¿qué es un valor x, y es 0 + 0 un valor x?
§3.10p1:
Un xValue (un “expira” valor) también se refiere a un objeto, por lo general cerca del final de su vida útil (de modo que sus recursos se pueden mover, por ejemplo). Un xvalor es el resultado de ciertos tipos de expresiones que implican referencias de valores (8.3.2).
No veo nada en §8.3.2 que sería útil aquí, pero sé que "0 + 0" no implica ninguna referencia rvalue. El literal 0 es un valor pr, que es "un valor r que no es un valor x" (§3.10p1). Creo que "0 + 0" también es un valor prve. Si eso es cierto, "decltype (0 + 0)" sería int (no int & &).
¿He perdido algo en mi interpretación? ¿Este código está bien formado?
decltype(0 + 0) x; // Not initialized.
El código se compila en GCC 4.7.0 20110427 y Clang 2.9 (tronco 126116). No estaría bien formado si el tipo de declty especificó un tipo int & &, por ejemplo.
No veo nada de malo en su razonamiento. Creo que 'decltype (0 + 0)' también debería ser 'int'. –
FWIW, una buena respuesta afirmativa sería ampliar la definición de xvalue y mostrar lo que puede y no puede ser. (Me parece que * muy * útil.) Necesito ver cómo volver a redactar para centrarse en "¿qué es un valor x?" mientras aún se considera este caso concreto de "0 + 0". –
pesar de que el último borrador hace especificar el category_ _value de muchas expresiones, incluyendo cosas como la subasta de sufijo y una nota de 3,10 indica que la cláusula 5 debe mostrar la categoría del valor para cada operador incorporado, no parece el proyecto de mencionar una categoría de valor para cualquiera de los operadores binarios de 5.6 a 5.15 a menos que mis poderes de búsqueda me hayan fallado. –