從草案C++標準(N3337):如果值true
或false
被存儲到任何尺寸的bool
類型的位字段應該使用int類型的位字段嗎?
9.6位字段
4(包括一一位比特字段),原始值和比特字段的值應相等。如果枚舉器的值存儲在相同枚舉類型的位字段中,並且位字段中的位數足夠大以容納該枚舉類型(7.2)的所有值,則原始枚舉器值和比特值的值應該相等。
對於其他類型的位字段,這個標準是非承諾的。爲了理解克++(4.7.3)如何與其它類型的位字段的交易,我使用了以下測試程序:
#include <iostream>
enum TestEnum
{
V1 = 0,
V2
};
struct Foo
{
bool d1:1;
TestEnum d2:1;
int d3:1;
unsigned int d4:1;
};
int main()
{
Foo foo;
foo.d1 = true;
foo.d2 = V2;
foo.d3 = 1;
foo.d4 = 1;
std::cout << std::boolalpha;
std::cout << "d1: " << foo.d1 << std::endl;
std::cout << "d2: " << foo.d2 << std::endl;
std::cout << "d3: " << foo.d3 << std::endl;
std::cout << "d4: " << foo.d4 << std::endl;
std::cout << std::endl;
std::cout << (foo.d1 == true) << std::endl;
std::cout << (foo.d2 == V2) << std::endl;
std::cout << (foo.d3 == 1) << std::endl;
std::cout << (foo.d4 == 1) << std::endl;
return 0;
}
輸出:
d1: true d2: 1 d3: -1 d4: 1 true true false true
我被的線驚訝輸出對應於Foo::d3
。輸出結果與ideone.com相同。
由於該標準對於int
類型的比特字段的比較是非承諾的,所以g ++似乎沒有違反標準。這讓我想起了我的問題。
是使用int
類型的位字段的一個壞主意嗎?它應該泄氣嗎?
那麼,我至少會對位字段使用'unsigned'類型,任何'signed'類型在語義上都沒有真正意義。 – 2014-09-19 18:58:16