作用域枚举:错误:无法在初始化中将“int”转换为“Handle”

mal*_*lat 4 c++ gcc language-lawyer c++11

我正在Scoped enumerations这里阅读页面:

\n\n

在此输入图像描述\n所以我决定尝试一下:

\n\n
$ cat e.cxx \n#include <cstdint>\nenum class Handle : uint32_t { Invalid = 0 };\nint main()\n{\n  Handle h { 42 }; // OK\n  return 0;\n}\n$ g++ -std=c++11 e.cxx\ne.cxx: In function \xe2\x80\x98int main()\xe2\x80\x99:\ne.cxx:5:17: error: cannot convert \xe2\x80\x98int\xe2\x80\x99 to \xe2\x80\x98Handle\xe2\x80\x99 in initialization\n   Handle h { 42 }; // OK\n\n             ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用:

\n\n
$ g++ --version\ng++ (Debian 5.3.1-14) 5.3.1 20160409\nCopyright (C) 2015 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我现在检查 GCC 中的 C++11 支持,看起来好像自GCC 4.8以来所有内容都受支持。

\n\n

那么我读错哪一页了?的示例Score enumertions不是 100% 正确,或者 GCC 中对 C++11 的支持仍然不完整?

\n

Som*_*ude 5

enum class(或enum struct) 创建类型。它不能简单地使用底层整数类型进行初始化,它需要显式转换,至少在 C++11 和 C++14 中是这样。

您显示的参考屏幕截图来自即将推出的 C++17 标准,该标准稍微放宽了要求,并允许这种类型的初始化。

  • @malat 看一下 cppreference 中的示例代码:它被标记为“since c++17”,因此不符合 c++11 并不奇怪 (2认同)