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
的整数来初始化强类型枚举?
答案 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