2017-03-15 37 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' 
} 

我的編譯器是clang 4.0選項-std=c++1z爲什麼強類型枚舉可以用一個沒有static_cast的整數初始化?

預計E e2 = 0;不好,因爲E是強類型的。然而,令我感到驚訝的是E e1{ 0 };應該沒問題。

爲什麼強類型的枚舉可以用一個沒有static_cast的整數初始化?

+3

根據自C++ 17以來允許的[documentation](http://en.cppreference.com/w/cpp/language/enum) – UnholySheep

回答

14

綜觀使用列表intializers的reference因爲C++ 17被允許:

兩種範圍的枚舉類型和無作用域枚舉類型,其 基礎類型是固定的可以從一個整數,未作 鑄造被初始化,使用列表初始化,如果滿足以下所有條件爲真:

  • 初始化是直接列表初始化
  • 初始化列表中有僅單個元件的
  • 枚舉要麼作用域或與固定基礎類型無作用域
  • 轉換將非變窄

鏘(根據implementation status page

支持這一點,因爲3.9版本

從版本7開始,GCC支持此功能(根據standards support page

請參閱此C++提案以獲取其他上下文和激勵ation:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf