2017-03-15 15 views
17
enum class E 
{}; 

int main() 
{ 
    E e1{ 0 }; // ok 

    E e2 = 0; // not ok 
    // error : cannot initialize a variable of 
    // type 'E' with an rvalue of type 'int' 
} 

제 컴파일러는 -std=c++1zclang 4.0입니다.강력한 형식의 열거 형을 static_cast없이 정수로 초기화 할 수있는 이유는 무엇입니까?

E은 강력한 형식이기 때문에 E e2 = 0;이 좋지 않을 것으로 예상됩니다. 그러나 놀란 것은 E e1{ 0 };이 좋습니다.

왜 강력한 형식의 열거 형을 static_cast없이 정수로 초기화 할 수 있습니까? 리스트 intializers를 사용 reference 찾고

+3

[documentation] (http://en.cppreference.com/w/cpp/language/enum)에 따르면 C++ 17 이후 허용됩니다. – UnholySheep

답변

14

는 C++ 17 때문에 허용된다

모두 열거 타입과 그 내부 형식 고정되는 캐스트없는 정수로 초기화 될 수 범위가 지정되지 않은 열거 유형 범위,

가 직접 목록을 초기화
  • 는 초기화 목록이
    • 초기화가되어 다음의 모두에 해당하는 경우, 목록 초기화를 사용하여 단일 요소
    • 열거는 범위 또는 고정 기본 유형의 범위가 지정되는 하나
    • 변환이
  • 연타 비 좁게되어

    합니다 ( implementation status page에 따른) 버전 3.9 이후이 지원

    GCC는 버전 7 이후를 지원합니다 (standards support page에 따라)

    추가 컨텍스트와 동기에 대해서는이 C++ 제안을 참조하십시오 ation : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf