#include <stdint.h>
enum state : uint8_t {
NONE,
USA,
CAN,
MEX
};
struct X {
state st : 2; // compiles with uint8_t st : 2
};
Clang 3.9.0编译成功。
GCC 4.8.4和5.3.0抱怨:
warning: ‘X::st’ is too small to hold all values of ‘enum state’
谁是对的?
答案 0 :(得分:1)
<强> TL; DR 强>
两者都是正确的。
枚举的值受基础类型的限制,枚举器不!
C ++ 14,7.2枚举声明,第8段:
可以定义一个枚举,该枚举的值不是由任何枚举器定义的。
这意味着可以:
state x = static_cast< state >(5);
这就是GCC警告你的问题:enum state
可能有不适合2位的值。
但是,只要您不尝试 到X::st
,一切都很闪亮。
那可能是为什么Clang 不警告你。
由于标准不要求任何一种诊断方法,警告或没有警告你没有错。