c++ c++11 language-lawyer void decltype

auto c++



¿Qué significa exactamente el vacío() en decltype(void())? (2)

Cito el this de @JoachimPileborg que parece explicarlo correctamente:

Creo que ya lo descubrí, decltype necesita una expresión, y no un tipo. void () no es en realidad un tipo aquí, pero una expresión, un reparto de estilo C (al igual que, por ejemplo, int (12.34)) void (void) no es una expresión por lo que no funciona. La forma en que el compilador analiza diferentes cosas depende del contexto, cuando espera un tipo, analiza como un tipo, cuando espera una expresión, analiza como una expresión. sizeof () (con los paréntesis) espera en primer lugar un tipo, de lo contrario se analiza como una expresión entre paréntesis.

No estoy buscando créditos o reputación.
De todos modos, creo que esa fue una respuesta interesante en la respuesta que vale la pena de una pregunta dedicada para futuros lectores.

Este es un seguimiento de this pregunta, más precisamente de los comentarios de this respuesta.

¿Qué representa exactamente el void() en decltype(void()) ?
¿Representa un tipo de función, una expresión o lo que sea?


Usando una gramática C ++ con hipervínculos , el análisis de decltype(void()) es:

decltype( expression ) decltype( assignment-expression ) decltype( conditional-expression )

... muchos pasos que implican el orden de las operaciones van aquí ...

decltype( postfix-expression ) decltype( simple-type-specifier ( expression-listopt ) ) decltype( void() )

Entonces void() es un tipo de expression aquí, en particular una postfix-expression .

Específicamente, citando la sección 5.2.3 [expr.type.conf] párrafo 2 de la norma ISO C ++ de 2011:

La expresión T() , donde T es un especificador de tipo simple o un especificador de nombre de tipo para un tipo de objeto completo sin matriz o el tipo void (posiblemente calificado por cv), crea un valor predeterminado del tipo especificado, que es valor- inicializado (8.5; no se realiza ninguna inicialización para el caso void() ).

Entonces void() es una expresión de tipo void , así como int() es una expresión de tipo int (con valor 0 ). Claramente, una expresión vacía no tiene valor, pero aquí está el operando de decltype , por lo que no se evalúa. decltype refiere solo al tipo de su operando, no a su valor.

decltype(void()) es simplemente una forma detallada de referirse al tipo void .