c++ language-lawyer void c++17 return-type-deduction

c++ - ¿El vacío{} es legal o no?



language-lawyer void (2)

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

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

Este es un seguimiento de this pregunta.
En los comentarios y en la respuesta se dice más de una vez que void{} no es un id de tipo válido ni una expresión válida .

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

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

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

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

Bueno, para ser honesto, estoy bastante seguro de que no tengo la habilidad suficiente para señalar un error en el borrador de trabajo, por lo que la verdadera pregunta es: ¿qué hay de malo 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?


Para mí suena como si alguien hubiera arruinado la fusión del 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 se produce una [...] declaración de return en una función declarada 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 una return sin operando, el inicializador se considera void() .

El estándar más nuevo permite las declaraciones if constexpr , por lo que el lenguaje necesario cambiar para reflejar eso. if constexpr conduce al concepto de una declaración de return potencialmente descartada (si la return encuentra en la rama no tomada de una constexpr si, entonces se descarta y el tipo de devolución se deduce de otras declaraciones de devolución, si las hay).

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

para una declaración de devolución no descartada que ocurre en una función declarada con un tipo de devolución que contiene un tipo de marcador de posición, T es la clase de devolución declarada y e es el operando de la declaración de return . Si la declaración de retorno no tiene operandos, entonces T es auto y el tipo de retorno deducido es void