根据C ++标准n4713,提供了非常相似的代码段。使用的类型是BOOL
(自定义),但是它可以应用于任何类型。
12.2.4
4如果将值true或false存储到bool
任何大小的类型的位域中(包括一个位域),则原始bool
值和该位域的值应相等。如果将枚举器的值存储到相同枚举类型的位域中,并且该位域中的位数大到足以容纳该枚举类型的所有值(10.2),则原始枚举器值和位字段的值应比较等于。[示例:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
—结束示例]
乍一看,粗体部分似乎可供解释。但是,当从enum BOOL
派生时,正确的意图就变得很清楚int
。
enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
struct mystruct s;
s.enabled = TRUE;
if(s.enabled == TRUE)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
使用以上代码,它会发出警告,而不会-Wall -pedantic
:
警告:“ mystruct :: enabled”太小,无法容纳“枚举BOOL”的所有值
struct mystruct { BOOL enabled:1; };
输出为:
被禁用 !!(使用时enum BOOL : int
)
如果enum BOOL : int
简单enum BOOL
,则输出如上述标准提示所示:
已启用(使用时enum BOOL
)
因此,可以得出结论,也有其他答案很少,该int
类型不足以仅在单个位字段中存储值“ 1”。
int
我认为它只能容纳值0
和-1
。