c++ - tamaño - ¿Es sizeof(int()) una expresión legal?
sizeof implementation (1)
Esta pregunta está inspirada en ¿Es sizeof (void ()) una expresión legal? pero con una diferencia importante como se explica a continuación.
La expresión en cuestión es:
sizeof( int() )
En la gramática de C ++ aparece:
expresión unaria
sizeof
de la expresión unariasizeof (
type-id)
sin embargo, ( int() )
puede emparejar ambos casos con diferentes significados:
- Como una expresión unaria , es un valor pr inicial
int
inicializado en valor, rodeado entre paréntesis redundantes - Como ID de tipo , es el tipo de una función sin parámetros que devuelven
int
.
En las restricciones semánticas para sizeof
, es decir, C ++ 14 [expr.sizeof] / 1, explica que la forma sizeof(
type-id )
no se puede aplicar a un tipo de función.
Sin embargo, no estoy seguro de si la violación de esa restricción semántica implica que sizeof( int() )
es correcta y usa la forma sizeof
de expresión unaria ; o si hay alguna otra regla que desambigua los dos casos en una etapa anterior de la comparación gramatical.
NÓTESE BIEN. Para la otra pregunta sizeof(void())
, ninguna de las dos interpretaciones es válida, por lo que se podría argumentar que el compilador es correcto al rechazar la expresión con un mensaje de error que indica que coincide con el formulario de identificación de tipo. Sin embargo, gcc rechaza sizeof( int() )
con un mensaje sobre type-id .
Para que quede claro, mi pregunta es: "¿Es sizeof( int() )
una expresión legal?", En particular sobre el detalle de cómo funciona la comparación gramatical cuando coinciden los dos casos anteriores.
No, sizeof( int() )
está mal formado porque int()
se toma como un tipo-id . Específicamente, es un tipo de función, y sizeof
no se puede aplicar a un tipo de función.
Una ambigüedad puede surgir de la similitud entre una conversión de estilo de función y una id de tipo . La resolución es que cualquier construcción que pueda ser una identificación de tipo en su contexto sintáctico se considerará una identificación de tipo .
con este ejemplo exacto dado:
void foo(signed char a) { sizeof(int()); // type-id (ill-formed) sizeof(int(a)); // expression sizeof(int(unsigned(a))); // type-id (ill-formed)