c++ - 使用 int 进行枚举类初始化
问题描述
我在编程时发现了一些有趣的事情:
enum class Foo {
FOO_THING,
FOO_TOO
};
int main() {
Foo foo{1}; // It is OK
Foo foo2(1); // It is an invalid
}
你能告诉我,为什么foo{1}
编译器可以,为什么foo2(1)
无效?
编译器 GCC ( g++ (Ubuntu 7.3.0-21ubuntu1~16.04) 7.3.0
) 说:
$ g++ -Wall -std=c++17 foo.cpp
error: cannot convert ‘int’ to ‘Foo’ in initialization
Foo foo2(1);
我真的很想知道底层的机制。:)))
编辑:也许这是一些编译器错误......
解决方案
特定于C++17 的文档具有以下用于大括号初始值设定项的内容
否则,如果 T 是具有固定基础类型的范围或非范围的枚举类型,并且如果花括号初始化列表只有一个初始化器,并且从初始化器到基础类型的转换是非缩小的,并且如果初始化是直接列表初始化,然后使用将初始化程序转换为其基础类型的结果初始化枚举。
所以foo
似乎符合有效的 C++17,但foo2
没有初始化是无效的。