Según el estándar n4713 de C ++, se proporciona un fragmento de código muy similar. El tipo utilizado es BOOL
(personalizado), pero puede aplicarse a cualquier tipo.
12.2.4
4 Si el valor verdadero o falso se almacena en un campo de bits de tipobool
de cualquier tamaño (incluido un campo de bits de un bit), elbool
valororiginaly el valor del campo de bits se compararán iguales. Si el valor de un enumerador se almacena en un campo de bits del mismo tipo de enumeración y el número de bits en el campo de bits es lo suficientemente grande para contener todos los valores de ese tipo de enumeración (10.2), el valor del enumerador original y el el valor del campo de bits se comparará igual . [Ejemplo:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
- ejemplo final]
A primera vista, la parte en negrita parece abierta a la interpretación. Sin embargo, la intención correcta se vuelve clara cuando enum BOOL
se deriva de 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");
}
Con el código anterior, da una advertencia sin -Wall -pedantic
:
advertencia: 'mystruct :: enabled' es demasiado pequeño para contener todos los valores de 'enum BOOL'
struct mystruct { BOOL enabled:1; };
La salida es:
Está desactivado !! (cuando se usa enum BOOL : int
)
Si enum BOOL : int
se simplifica enum BOOL
, la salida es como especifica el pasaje estándar anterior:
Está habilitado (cuando se usa enum BOOL
)
Por lo tanto, se puede concluir, también como pocas otras respuestas tienen, que el int
tipo no es lo suficientemente grande para almacenar el valor "1" en un solo campo de bits de bits.
int
creo que solo puede contener los valores0
y-1
.