Es void{} legal o no?


Esta es una continuación de esta pregunta.
En los comentarios y en la respuesta se dice más de una vez que void{} no es ni un type-id válido ni una expresión válida.

Eso estaba bien, tenía sentido y eso era todo.

Entonces llegué a través [7.1.7.4.1/2] (deducción del tipo de marcador de posición ) del borrador de trabajo.
Allí se dice que:

[...]
- para una declaración no descartada return que ocurre en una función declarada con un tipo de retorno que contiene un tipo de marcador de posición, T es el tipo de retorno declarado y e es el operando de la instrucción return. Si la instrucción return no tiene operando, entonces e es void{};
[...]

Entonces, ¿es void{} (conceptualmente) legal o no?
Si es aceptable como se menciona en el borrador de trabajo (aunque solo como una - como si fuera una - declaración), debe ser legal de hecho. Esto significa que decltype(void{}) también debe ser válido, como ejemplo.
De lo contrario, ¿debería el borrador de trabajo usar void() en lugar de void{}?


Bueno, para ser honesto, estoy bastante seguro de que no soy lo suficientemente hábil para señalar un error en el borrador de trabajo, por lo que la verdadera pregunta es: ¿qué 'está mal en mi razonamiento?
¿Cuál es exactamente el void{} mencionado en la viñeta anterior y por qué es una expresión legal en este caso?

Author: Community, 2016-09-06

2 answers

A mí me parece que alguien se equivocó al fusionar el estándar anterior con el nuevo.

Anteriormente el estándar decía esto: (C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):

Cuando un [...] return la sentencia ocurre en una función declarado con un tipo de retorno que contiene un tipo de marcador de posición, el tipo de retorno deducido o el tipo de variable se determina a partir del tipo de su inicializador. En el caso de un return sin operando, el inicializador es considera void().

El nuevo estándar permite las sentencias if constexpr, por lo que el lenguaje debe cambiar para reflejar eso. if constexpr conduce al concepto de un potencial descartado return sentencia (si la return está en la rama no tomada de un constexpr if, entonces se descarta y el tipo de retorno se infiere de otras sentencias de retorno, si las hay).

Probablemente la nueva redacción debería ser algo así como:

Para una declaración de retorno no descartada que ocurre en un función declarado con un tipo de retorno que contiene un tipo de marcador de posición, T es el el tipo de retorno declarado y e es el operando de la instrucción return. Si la sentencia return no tiene operando, entonces T es auto y el tipo de retorno deducido es void

 11
Author: AndyG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 14:44:39

Confirmado el error. Ya está arreglado.
Aquí está la discusión (bastante corta para ser honesto).

Entonces, la respuesta es - no, void{} no es legal.
Era un error de redacción del borrador de trabajo.

 10
Author: skypjack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 10:54:42