L'utilisation de membres définis précédemment en tant que membres ultérieurs d'une définition d'enum est-elle légale?
-
06-07-2019 - |
Question
namespace ValueType {
enum Enum {
Boolean = 0,
Float = 1,
Double,
SInt = 8,
SLong,
UInt = SInt + (1 <<4),
ULong = SLong + (1 << 4)
};
}
La solution
Oui, l'exigence est qu'il s'agisse d'une expression constante intégrale. La norme C ++ inclut l'exemple suivant:
enum { d, e, f=e+2 };
Autres conseils
Comme indiqué par Jerry , c’est légal.
Dans de rares cas, il est conscient que le type des énumérateurs n’est spécifié que lorsque l’énumération est entièrement définie. La norme indique ce qui suit concernant le type des énumérations (7.2 / 4):
Chaque énumération définit un type différent de tous les autres types. Après l'accolade fermante d'un spécificateur d'énumération, chaque énumérateur a le type de son énumération. Avant l'accolade de fermeture, le type de chaque énumérateur est le type de sa valeur d'initialisation. Si un initialiseur est spécifié pour un énumérateur, la valeur d'initialisation a le même type que l'expression. Si aucun initialiseur n'est spécifié pour le premier énumérateur, le type est un type intégral non spécifié . Sinon, le type est identique à celui de la valeur d'initialisation de l'énumérateur précédent, à moins que la valeur incrémentée ne soit pas représentable dans ce type, auquel cas le type est un type entier non spécifié suffisant pour contenir la valeur incrémentée.
La phrase en surbrillance peut être montrée dans l'exemple suivant:
enum E {
E0 // Unspecified type
, E1 = E0-1 // -1, or MAX_UINT
, E2 // 0 or (MAX_UINT+1)
};
En principe, le type choisi pour E0
affecte la valeur résultante de E1
.