2010-02-10 1 views
6

Tôi tin rằng C++ mới tiêu chuẩn cho phép đối với một "phạm vi" thêm với nhiều loại liệt kê:`typedef enum {} t` có cho phép định danh phần tử enum trong C++ 0x không?

enum E { e1, e2 }; 

E var = E::e1; 

Vì tôi biết rất nhiều file nguồn chứa cũ C kiểu enum typedef, tôi tự hỏi nếu các tiêu chuẩn mới sẽ cho phép sử dụng typedef cho các loại liệt kê khác nặc danh:

typedef enum { d1, d2 } D; 
D var = D::d1; // error? 
+0

Tôi đoán rằng 'D' được định nghĩa với typedef là cho các mục đích thực tế tương đương với một' enum D {} 'đúng và vì vậy các quy tắc tương tự áp dụng cho cả hai. Vì vậy, không, đó không phải là một lỗi trong C++ 0x. – Manuel

+1

+1 cho cuối cùng gọi nó là C++ 1x :) –

+1

Tôi thích C++ 0x vì đó là thuật ngữ Stroustroup mình sử dụng. – Manuel

Trả lời

5

các tiêu chuẩn mới sẽ bổ sung thêm một loại mới của enum mạnh mẽ, nhưng cú pháp sẽ hơi khác nhau, và sự đếm kiểu cũ sẽ tương thích (mã hợp lệ trong C + +03 sẽ là mã C++ 0x hợp lệ), do đó bạn sẽ không cần phải làm bất cứ điều gì để giữ mã kế thừa hợp lệ (không t typedef, không phải cái gì khác).

enum class E { e1, e2 }; // new syntax, use E::e1 
enum E2 { e1, e2 }; // old syntax, use e1 or E2::e1 (extension) 

Có câu hỏi thường gặp về C++ here đề cập đến vấn đề cụ thể này.

+1

Tôi nghĩ rằng OP biết typedef là không cần thiết, anh ta chỉ quan tâm đến mã C cũ có sử dụng nó. – Manuel

+0

Mã kế thừa sẽ sử dụng các enums phong cách cũ, và những enums (một trong OP) sẽ mang tên vào phạm vi kèm theo. Tôi đang chỉnh sửa câu trả lời để nó rõ ràng hơn. –