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

xml*_*lmx 17 c++ standards enums type-safety c++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'
}
Run Code Online (Sandbox Code Playgroud)

我的编译器clang 4.0有选项-std=c++1z.

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

为什么强类型枚举可以用一个整数来初始化static_cast

Unh*_*eep 14

综观参考使用列表intializers因为C++ 17被允许:

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

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

自3.9版以来,Clang支持此功能(根据实施状态页面)

GCC从版本7开始支持此功能(根据标准支持页面)

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