根据C++ 标准 n4713,提供了一个非常相似的代码片段。使用的类型是BOOL
(自定义),但它可以应用于任何类型。
12.2.4
4如果值真或假存储到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”太小,无法容纳“enum BOOL”的所有值
struct mystruct { BOOL enabled:1; };
输出是:
被禁用 !!(使用时enum BOOL : int
)
如果enum BOOL : int
是 simple enum BOOL
,则输出如上述标准段落所指定:
已启用(使用时enum BOOL
)
因此,可以得出结论,也很少有其他答案,该int
类型不足以将值“1”存储在单个位位字段中。