Scoped枚举:错误:初始化时无法将'int'转换为'Handle'

时间:2016-05-24 12:40:37

标签: c++ c++11 gcc language-lawyer

我正在阅读hereboost::circular_buffer<bool> stuff; stuff.push_back(false); stuff.push_back(true); cout << stuff.size() << endl; // prints 0 页面:

enter image description here 所以我决定尝试一下:

size()

使用:

Scoped enumerations

如果我现在检查GCC中的C ++ 11支持,看起来好像从GCC 4.8开始支持所有内容。

我读错了哪个页面? $ cat e.cxx #include <cstdint> enum class Handle : uint32_t { Invalid = 0 }; int main() { Handle h { 42 }; // OK return 0; } $ g++ -std=c++11 e.cxx e.cxx: In function ‘int main()’: e.cxx:5:17: error: cannot convert ‘int’ to ‘Handle’ in initialization Handle h { 42 }; // OK ^ 的示例不是100%正确,或者GCC中对C ++ 11的支持仍然不完整?

2 个答案:

答案 0 :(得分:3)

enum struct(或import serial import serial.tools from serial.tools import list_ports #I also tried: #import serial.tools.list_ports #from serial import tools #import serial.tools.list_ports #from serial import tools )会创建类型。它不能使用底层整数类型进行初始化,需要明确地进行初始化,至少在C ++ 11和C ++ 14中是这样。

您展示的参考屏幕截图来自即将推出的C ++ 17标准,该标准可以放宽要求,并允许进行此类初始化。

答案 1 :(得分:1)

有问题的措辞来自P0138R2:枚举类值的构造规则。正如您所看到的,该论文的日期是2016年3月 - 对C ++ 11来说已经太晚了!

措辞包含在[dcl.init.list]的最新工作草案N4582中,如建议:

  

否则,如果T是具有固定基础类型(7.2)的枚举,[...]

clang 3.9显然已经实现了这个例子,但我不会感到惊讶的是编译器还不支持这些新功能。给它一点时间。