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 dereturn
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 ye
es el operando de la declaración dereturn
. Si la declaración dereturn
no tiene ningún operando, entoncese
esvoid{}
;
[...]
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 unareturn
sin operando, el inicializador se consideravoid()
.
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 ye
es el operando de la declaración dereturn
. Si la declaración de retorno no tiene operandos, entoncesT
esauto
y el tipo de retorno deducido esvoid