Les enums C++ signés ou non signés ? Et par extension est-il sécuritaire valider une entrée en vérifiant qu’il est = votre valeur min (en supposant que vous avez commencé à 0 et incrémenté de 1) ?
Réponses
Trop de publicités?Nous allons aller à la source. Voici ce que le C++03 norme (ISO/IEC 14882:2003) document dit dans 7.2-5 (Énumération des déclarations):
Le type sous-jacent d'une énumération est un type intégral qui peut représenter tous les énumérateur valeurs définies dans l'énumération. Il est la mise en œuvre définies intégral type est utilisé comme le type sous-jacent pour une énumération, sauf que le le type sous-jacent ne doit pas être plus grand que d'int moins que la valeur d'un énumérateur ne peuvent pas rentrer dans un int ou unsigned int.
En bref, votre compilateur fait le choix (évidemment, si vous avez des nombres négatifs pour certains de vos ennumeration valeurs, ça va être signé).
Vous ne devrait pas compter sur une représentation spécifique. Lire le liensuivant. En outre, la norme dit qu’il est défini par l’implémentation quel type intégral est utilisé comme type sous-jacent d’un enum, sauf qu’il ne doit pas être supérieur à int, à moins qu’une valeur ne peut pas tenir en int ou unsigned int
En bref : vous ne pouvez pas compter sur un enum étant soit signé ou non signé.
Vous ne devriez pas compter sur elle étant soit signé ou non signé. Selon la norme, c'est la mise en œuvre défini le type intégral est utilisé comme le type sous-jacent pour un enum. Dans la plupart des implémentations, cependant, il est un entier signé.
Dans C++0x fortement typé énumérations sera ajoutée qui va vous permettre de spécifier le type d'une enum tels que:
enum X : signed int { ... }; // signed enum
enum Y : unsigned int { ... }; // unsigned enum
Même maintenant, cependant, certains de validation simple peut être réalisé à l'aide de la enum comme une variable ou d'un type de paramètre comme ceci:
enum Fruit { Apple, Banana };
enum Fruit fruitVariable = Banana; // Okay, Banana is a member of the Fruit enum
fruitVariable = 1; // Error, 1 is not a member of enum Fruit
// even though it has the same value as banana.