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 typebool
de n'importe quelle taille (y compris un champ de bits d'un bit), labool
valeur 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 BOOL
est 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 : int
est 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 int
type n'est pas assez grand pour stocker la valeur "1" dans un seul champ de bits.
int
je pense qu'il ne peut contenir que les valeurs0
et-1
.