Même certaines vieilles réponses ont obtenu 44 votes positifs, j'ai tendance à ne pas être d'accord avec toutes. En bref, je ne pense pas que nous devrions nous soucier underlying type
de l'énumération.
Tout d'abord, le type Enum C ++ 03 est un type distinct qui n'a pas de concept de signe. Depuis la norme C ++ 03dcl.enum
7.2 Enumeration declarations
5 Each enumeration defines a type that is different from all other types....
Ainsi, lorsque nous parlons du signe d'un type enum, par exemple lorsque nous comparons 2 opérandes enum à l'aide de l' <
opérateur, nous parlons en fait de convertir implicitement le type enum en un type intégral. C'est le signe de ce type intégral qui compte . Et lors de la conversion d'énumération en type intégral, cette instruction s'applique:
9 The value of an enumerator or an object of an enumeration type is converted to an integer by integral promotion (4.5).
Et, apparemment, le type sous-jacent de l'énumération n'a rien à voir avec la promotion intégrale. Puisque la norme définit la promotion intégrale comme ceci:
4.5 Integral promotions conv.prom
.. An rvalue of an enumeration type (7.2) can be converted to an rvalue of the first of the following types that can represent all the values of the enumeration
(i.e. the values in the range bmin to bmax as described in 7.2: int, unsigned int, long, or unsigned long.
Ainsi, si un type enum devient signed int
ou unsigned int
dépend de si signed int
peut contenir toutes les valeurs des énumérateurs définis, pas le type sous-jacent de l'énumération.
Voir ma question connexe
Signe du type d'énumération C ++ incorrect après la conversion en type intégral