为什么强类型枚举可以用没有static_cast的整数初始化?

时间:2017-03-15 09:47:31

标签: c++ enums standards c++17 type-safety

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

预计E e2 = 0;不正常,因为E是强类型的。然而,让我感到惊讶的是E e1{ 0 };应该没问题。

为什么可以使用不带static_cast的整数来初始化强类型枚举?

1 个答案:

答案 0 :(得分:14)

从C ++ 17开始,允许查看reference使用列表初始化器:

  

两种范围的枚举类型和未范围的枚举类型   固定的底层类型可以从没有a的整数初始化   如果满足以下所有条件,则使用列表初始化强制转换:

     
      
  • 初始化是直接列表初始化
  •   
  • 初始化列表只有一个元素
  •   
  • 枚举是作用域或未作用域,基础类型为固定
  •   
  • 转换为非缩小
  •   

Clang从版本3.9(根据implementation status page

支持此功能

GCC从版本7(根据standards support page

支持此功能

有关其他背景和动机,请参阅此C ++提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0138r2.pdf