El CCG rechaza una declaración simple con una base de enumeración; clang la acepta, ¿cuál es la correcta?
GCC 4.9.2 no compila este fragmento, pero clang 3.5.0 lo hace. Cuál es la correcta?
enum F : int { x, y, z};
int F;
enum F:int f = F::x;
Salida GCC:
main.cpp:3:12: error: expected ';' or '{' before 'f'
enum F:int f = F::x;
^
main.cpp:3:12: error: expected class-key before 'f'
main.cpp:3:14: error: invalid type in declaration before '=' token
enum F:int f = F::x;
^
main.cpp:3:16: error: 'F' is not a class, namespace, or enumeration
enum F:int f = F::x;
^
Creo que GCC es correcto, ya que una declaración simple (que contiene el especificador de tipo elaborado enum F
) no permite una base de enumeración (: int
), pero me gustaría una confirmación de esto.
2 answers
Su razonamiento es correcto. Un enum-base como ": int
" se permite sintácticamente solo en un enum-specifier, que debe contener una {
lista de enumeradores entre corchetes }
, o en una opaque-enum-declaration, que debe seguir a la enum-base con un punto y coma inmediato ;
.
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
2015-04-24 14:29:10
Creo que gcc es correcto. Si nos fijamos en las reglas gramaticales en [dcl.enum], el especificador de tipo viene con:
base de enumeración:
:
type-specifier-seq
Los tokens que contienen un enum-base son:
especificador de enum:
enum-head{
enumerador-listopt}
enum-head{
enumerador-lista,
}
enum-head:
enum-clave atributo-especificador-seqopt identifieropt enum-baseopt
enum-clave atributo-especificador-seqopt nested-nombre-especificador de identificador enum-baseopt
Y
declaración de enum opaco:
enum-clave atributo-especificador-seqopt identificador enum-baseopt;
Esta expresión:
enum F:int f = F::x;
No es un especificador de enum (no hay {}
s presentes) ni una declaración de enum opaco (en la que el especificador de tipo sería seguido inmediatamente por un ;
). Como no está en la gramática de C++, no es una expresión válida.
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
2015-04-24 17:08:26