2015-04-24 12 views
23

GCC 4.9.2 không biên dịch đoạn mã này, nhưng clang 3.5.0 thì không. Cái nào đúng?GCC từ chối một tuyên bố đơn giản với một cơ sở enum; clang chấp nhận nó - đó là chính xác?

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

đầu ra 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; 
       ^

Tôi tin GCC là đúng, như một đơn giản tuyên bố (chứa xây dựng-type-specifier enum F) không cho phép một enum-base (: int), nhưng tôi muốn một số xác nhận về điều này.

+10

Tiêu đề câu hỏi hữu ích ít nhất: -S –

+0

Điều tôi có thể nói chắc chắn là 'F' không phải là' enum class' để 'F :: x' không hợp lệ. – GreenScape

+2

@GreenScape, Bạn không cần một enum phạm vi để sử dụng toán tử phân giải phạm vi. – chris

Trả lời

13

Lý do của bạn là chính xác. Một enum-base như ": int" là cú pháp cho phép chỉ trong một enum-specifier, trong đó phải có một danh sách { ngoặc } của điều tra viên, hoặc trong một đục-enum khai, mà phải tuân theo các enum -base với dấu chấm phẩy ngay lập tức ;.

19

Tôi tin gcc là chính xác. Nếu chúng ta xem xét các quy tắc ngữ pháp trong [dcl.enum], các Bộ xác định kiểu đi kèm với:

enum-base:
:type-specifier-seq

Các thẻ có chứa một enum-base là:

enum-specifier:
    enum đầu{Enumerator-listopt}
    enum đầu{Enumerator-list,}
enum đầu:
    enum-keythuộc tính-specifier-seqoptidentifieroptenum-baseopt
    enum-keythuộc tính-specifier-seqoptlồng nhau-tên-specifierđịnh danh enum-baseopt

đục-enum-khai:
    enum-keythuộc tính-specifier-seqoptđịnh danhenum-baseopt;

biểu này:

enum F:int f = F::x; 

Không phải là enum-specifier (không có {} s hiện tại) và cũng không phải là đục-enum tuyên bố (trong đó loại-specifier sẽ được theo sau ngay lập tức bởi ;). Vì nó không có trong ngữ pháp C++, nó không phải là một biểu thức hợp lệ.

Các vấn đề liên quan