2014-12-27 19 views
5

Tôi đang cố gắng hiểu enum được xác định bằng tên-lồng nhau-specifiers. Có gì tiêu chuẩn nói là N4296:7.2/4 [dcl.enum]:Enum được giới thiệu bằng cách sử dụng tờ khai

Nếu enum-key được theo sau bởi một lồng nhau-tên-specifier, các enum-specifier sẽ đề cập đến một điều tra mà trước đây tuyên bố trực tiếp trong lớp hoặc namespace để mà lồng nhau-tên-specifier đề cập (tức là, không phải kế thừa và cũng không giới thiệu bởi một sử dụng-khai), và enum-specifier sẽ xuất hiện trong một không gian tên kèm theo tờ khai trước đó.

Vâng, tại sao ví dụ sau đây hoạt động?

#include <iostream> 

namespace A 
{ 
    namespace B 
    { 
     enum E : int; 
    } 
} 
namespace C 
{ 
    using A::B::E; 
} 

enum C::E : int { x = 2 }; 

int main() 
{ 
} 

DEMO

Trong namescape C, chúng tôi tuyên bố enum E bằng tuyên bố, và sau đó gọi nó với định nghĩa enum. Trình biên dịch có thể đã ném một lỗi, nhưng nó không. Có gì sai, đâu là sự hiểu lầm?

+3

Có vẻ như bạn đã tìm thấy lỗi trình biên dịch. –

+0

@ T.C. Vì vậy, nói chung mã sau đây không nên hoạt động quá http://coliru.stacked-crooked.com/a/b4e682437a639a1b phải không? –

+0

@ T.C. Bạn không thể có được một ví dụ với thừa kế? –

Trả lời

2

Rõ ràng, vì lý do bạn đưa ra, đây là lỗi trình biên dịch.
Điều thú vị là cả Clang 3.5.0 và GCC 4.9 đều chấp nhận chương trình.

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