Conformément à la norme C ++ n4713 , un extrait de code très similaire est fourni. Le type utilisé est BOOL(personnalisé), mais il peut s'appliquer à n'importe quel type.
12.2.4
4 Si la valeur true ou false est stockée dans un champ de bits de typeboolde n'importe quelle taille (y compris un champ de bits d'un bit), laboolvaleur d'origineet la valeur du champ de bits doivent être comparées égales. Si la valeur d'un énumérateur est stockée dans un champ de bits du même type d'énumération et que le nombre de bits dans le champ de bits est suffisamment grand pour contenir toutes les valeurs de ce type d'énumération (10.2), la valeur de l'énumérateur d'origine et le la valeur du champ de bits doit être comparée égale . [ Exemple:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
- fin d'exemple]
Au premier coup d'œil, la partie en gras semble ouverte à l'interprétation. Cependant, l'intention correcte devient claire lorsque le enum BOOLest dérivé du 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");
}
Avec le code ci-dessus, il donne un avertissement sans -Wall -pedantic:
avertissement: 'mystruct :: enabled' est trop petit pour contenir toutes les valeurs de 'enum BOOL'
struct mystruct { BOOL enabled:1; };
La sortie est:
Est désactivé !! (lors de l'utilisation enum BOOL : int)
Si enum BOOL : intest simplifié enum BOOL, alors la sortie est comme le spécifie le pasage standard ci-dessus:
Est activé (lors de l'utilisation enum BOOL)
Par conséquent, il peut être conclu, comme peu d'autres réponses l'ont fait, que le inttype n'est pas assez grand pour stocker la valeur "1" dans un seul champ de bits.
intje pense qu'il ne peut contenir que les valeurs0et-1.