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.

Author: T.C., 2015-04-24

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

 13
Author: aschepler,
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.

 19
Author: Barry,
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