2017-03-15 6 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は厳密に型指定されているため、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++の提案を参照してください:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf

関連する問題