2015-04-24 7 views
23

GCC 4.9.2 nie kompiluje tego opisu, ale robi to clang 3.5.0. Który jest prawidłowy?GCC odrzuca prostą deklarację z bazą enum; clang to akceptuje - co jest poprawne?

enum F : int { x, y, z}; 
int F; 
enum F:int f = F::x; 

wyjściowego 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; 
       ^

wierzę GCC jest poprawny, w prosty zgłoszenia (zawierającego opracowany TYPU specyfikatora enum F) nie pozwalają na enum bazy (: int), ale chciałbym potwierdzić to.

+10

Najmniej przydatne pytanie: -S –

+0

Co mogę powiedzieć na pewno, że 'F' nie jest' enum class', więc 'F :: x' jest nieprawidłowe. – GreenScape

+2

@ Zielony ekran, do korzystania z operatora rozdzielczości nie jest konieczne wyliczenie z zakresem. – chris

Odpowiedz

13

Twoje rozumowanie jest prawidłowe. enum-base jak „: int” jest składniowo dozwolone tylko w enum-specyfikatorem, który musi zawierać { nawias } listy rachmistrzów lub w nieprzezroczystego-enum-deklaracji, który musi być zgodny z enum -wartość z natychmiastowym średnikiem ;.

19

Wierzę, że gcc jest poprawny. Jeśli spojrzymy na zasady gramatyki w [dcl.wyliczenia] specyfikacja typu pochodzą z:

wyliczeniowego bazy:
:typu specyfikator-nast

Znaczniki, które zawierają enum bazy są:

Specyfikacja szczegółowa:
    enum-head{wyliczający-listopt}
    enum-head{wyliczający-lista,}
enum-head:
    enum-keyatrybut specifier-seqoptidentifieroptenum-baseopt
    enum-keyatrybut specifier-seqoptnested-name-specifieridentyfikator enum-baseopt

i

nieprzezroczysty-enum-deklaracja:
    enum-keyatrybut specifier-seqoptidentyfikatorenum-baseopt;

To wyrażenie:

enum F:int f = F::x; 

jest ani enum-specifier (bez {} s obecne) ani nieprzezroczysty-enum-deklaracja (w którym typu specifier byłyby następnie natychmiast przez ;). Ponieważ nie jest to gramatyka C++, nie jest to poprawne wyrażenie.

Powiązane problemy