#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’
谁是对的?
最佳答案 TL; DR
两者都是正确的.
枚举的值受基础类型的限制,而不是枚举器的限制!
C 14,7.2列举声明,第8段:
It is possible to define an enumeration that has values not defined by any of its enumerators.
这意味着有可能:
state x = static_cast< state >(5);
这就是GCC警告你的事情:枚举状态可能有不适合2位的值.
但是,只要您不尝试对X :: st实际执行此操作,一切都是闪亮的.
这(可能)是为什么Clang不会警告你.
由于标准不要求任何一种诊断方法,因此警告或没有警告您没有错.