type que programacion para libreria how example enumeracion enum c++ c++11 enums language-lawyer c++14

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 ; .