que - libreria para enum c++
GCC rechaza una declaración simple con una enum-base; Clang lo acepta, ¿cuál es el correcto? (2)
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 la enum F
del especificador de tipo elaborado) no permite una enum-base ( : int
), pero me gustaría cierta confirmación al respecto.
Creo que gcc es correcta. Si observamos las reglas gramaticales en [dcl.enum], el especificador de tipo viene con:
enumeración:
:
tipo-especificador-seq
Los tokens que contienen una enum-base son:
especificador de enumeración:
enum-head{
enumerator-listopt}
enum-head{
enumerator-list,
}
cabeza de enumeración
enum-key atributo-especificador-seqopt identifieropt enum-baseopt
enum-key atributo-especificador-seqopt identificador -nombre-anidado identificador enum-baseopt
y
declaración-enumeración opaca
enum-key atributo-especificador-seqopt identificador enum-baseopt;
Esta expresión:
enum F:int f = F::x;
No es un especificador de enumeración (no hay {}
s presente) ni una declaración de enumeración opaca (en la que el especificador de tipo sería seguido inmediatamente por una ;
). Como no está en la gramática de C ++, no es una expresión válida.
Tu razonamiento es correcto. Una enum-base como " : int
" solo se permite de manera sintáctica en un enum-specifier , que debe contener una lista de enumeradores {
bracketed }
, o en una opaque-enum-statement , que debe seguir la enum-base con un punto y coma inmediato ;
.