どおりC ++標準n4713、非常に類似したコードスニペットが提供されます。使用されるタイプはBOOL
(カスタム)ですが、どのタイプにも適用できます。
12.2.4
4 trueまたはfalseの値bool
が任意のサイズのタイプのビットフィールド(1ビットのビットフィールドを含む)に格納されている場合、元のbool
値とビットフィールドの値は等しくなります。列挙子の値が同じ列挙型のビットフィールドに格納され、ビットフィールドのビット数がその列挙型のすべての値(10.2)を保持するのに十分な大きさである場合、元の列挙子の値と元の列挙子の値ビットフィールドの値は、equalと比較されます。[例:
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
)
したがって、他のいくつかの回答が持っているように、そのタイプは単一のビットビットフィールドに値「1」を格納するのに十分な大きさではないと結論付けることができますint
。
int
私が思うように宣言されているので、値0
とのみを保持できます-1
。