2015-02-06 5 views
3

N3936 (7.2.2 절) "범위가 지정된 열거 형의 선언에서 선택적 식별자를 생략해서는 안됩니다."따라서 (모두 포함 된 주석이 내 해석을 설명하려고 시도하는) 코드를 시도했습니다. GNU-g ++ 그 소리가 코드를 거부하고 "열거는 이름이 필요합니다 범위"고 말하는 열거 선언에서 메시지에서 오류가 발생 3.4.2은폐 및 익명 열거 형 선언이 표준 요구 사항과 어떻게 일치합니까?

# include <iostream> 

enum any : int; // unscoped opaque declaration :int required by the standard 

enum : int {a} t; // unscoped anonymous declaration of t (:int not required) 

enum any : int {b} u; // redlecaration of type "any" with one enumerator 

enum class foo : char; // scoped opaque declaration "foo" required, :char NOT 

enum class foo : char {a, b} Foo; // redeclaration of "foo" with 2 
           // enumerators. now :char REQUIRED 


enum class : char {d} Enum; // scoped anonymous declaration of Enum 
         // wouldn't be disallowed? 

int main() 
    { 
    t = a; // assignment to "t" 
    u = b; // assignment to "u" 
    Foo = foo::a; // assignment to "Foo" 
    Enum = decltype(Enum)::d; // allowed (??) 
    std::cout << static_cast<int>(t) << ' ' 
    << static_cast<int>(u) << ' ' 
    << static_cast<int>(Foo) << ' ' 
    << static_cast<int>(Enum) << std::endl; 
    } 

4.8.3 및 그 소리; 그러나 GNU-g ++은 을 받아들이고 표준 출력에 4 개의 0을 넣는 것을 실행합니다 (코드가 실행되면 예상대로). 열거의 이름 "D"는 것처럼 그 경우, "A"로 변경하면 문제를 더 오류를 연타

은 참고 잘못 열거가 이름으로 범위가 지정되지 않은 열거 될 것와 "A"충돌 선언 "any"유형의 동일한 이름 (적어도 이것은 내가 진단을 읽는 것으로 해석 한 것입니다). 대신 GNU-g ++은 Enum의 열거 자에 대해 "a"라는 이름을 (일관되게) 으로 받아들입니다.

그래서 진실은 무엇입니까?

답변

3

표준은 매우 분명합니다. 코드가 잘못 작성되었습니다.

그러나 GNU-g ++는 표준 출력에 4 개의 0을 넣는 것을 실행합니다 (코드가 실행되면 예상대로).

이것은 GCC bug 54216입니다. 이 버그는 GCC 4.9에서 수정되었으며 코드는 예상대로 rejects입니다. 열거의 이름 "D" 그 경우처럼, "A"로 변경 될 때 문제를 더 오류를 연타

은 참고 잘못 이름으로 범위가 지정되지 않은 열거 될 것이다 열거 선언 "A" "any"유형의 동일한 이름과 충돌합니다 (적어도 이것은 내가 진단을 읽는 것으로 해석 된 입니다).

연타은 아마 당신이 정말로 익명 범위가 지정되지 않은 열거 형을 선언하는 의미한다고 가정하고 가정의 코드의 나머지 부분을 구문 분석 진행.

+0

감사합니다. 그 버그를 찾지 못했습니다. – GSi