De acordo com o padrão C ++ n4713 , um trecho de código muito semelhante é fornecido. O tipo usado é BOOL
(personalizado), mas pode se aplicar a qualquer tipo.
12.2.4
4 Se o valor true ou false for armazenado em um campo de bitsbool
de qualquer tamanho (incluindo um campo de bits de um bit), obool
valororiginale o valor do campo de bits devem ser comparados. Se o valor de um enumerador for armazenado em um campo de bits do mesmo tipo de enumeração e o número de bits no campo de bits for grande o suficiente para conter todos os valores desse tipo de enumeração (10.2), o valor do enumerador original e o o valor do campo de bits deve ser igual . [Exemplo:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
- exemplo final]
À primeira vista, a parte em negrito parece aberta para interpretação. No entanto, a intenção correta torna-se clara quando o enum BOOL
é derivado do 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");
}
Com o código acima, ele dá um aviso sem -Wall -pedantic
:
aviso: 'mystruct :: enabled' é muito pequeno para conter todos os valores de 'enum BOOL'
struct mystruct { BOOL enabled:1; };
O resultado é:
Está desabilitado !! (ao usar enum BOOL : int
)
Se enum BOOL : int
for simplificado enum BOOL
, a saída será como a passagem padrão acima especifica:
Está habilitado (ao usar enum BOOL
)
Portanto, pode-se concluir, também como poucas outras respostas, que o int
tipo não é grande o suficiente para armazenar o valor "1" em um único campo de bits.
int
eu acho que ele só pode conter os valores0
e-1
.