首页 > 解决方案 > 使用 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++enumsinitializationc++17

解决方案


特定于C++17 的文档具有以下用于大括号初始值设定项的内容

否则,如果 T 是具有固定基础类型的范围或非范围的枚举类型,并且如果花括号初始化列表只有一个初始化器,并且从初始化器到基础类型的转换是非缩小的,并且如果初始化是直接列表初始化,然后使用将初始化程序转换为其基础类型的结果初始化枚举。

所以foo似乎符合有效的 C++17,但foo2没有初始化是无效的。


推荐阅读