namespace ValueType {
enum Enum {
Boolean = 0,
Float = 1,
Double,
SInt = 8,
SLong,
UInt = SInt + (1 <<4),
ULong = SLong + (1 << 4)
};
}
Répondre
Oui - l'exigence est qu'il s'agit d'une expression constante intégrale. La norme C comprend de l'exemple suivant:
enum { d, e, f=e+2 };
Quand j'ai vu ta réponse et celle de Pavel, je me suis immédiatement rappelé de boost et de méta-programmation, comment je ne m'en suis pas souvenu? il h. Merci. :) – Geoff
Il est même possible d'utiliser des booléens: ** enum {yes = true, no =! Yes}; ** – fmuecke
Oui, selon les règles de C++, les types * integral * incluent "bool, char, wchar_t, les types entiers signés et non signés "et" les valeurs booléennes se comportent comme des types entiers ". –
Comme l'a souligné Jerry, il est légal.
Dans certains cas rares, son hargne étant conscient que le type des énumérateurs est seulement spécifié après que l'énumération est entièrement définie. La norme dit ce qui suit sur le type des énumérations (7.2/4):
Chaque énumération définit un type qui est différent de tous les autres types. Après l'accolade fermante d'un spécificateur enum, 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 le même que le type de la valeur d'initialisation de l'énumérateur précédent, sauf si la valeur incrémentée n'est pas représentable dans ce type, auquel cas le type est un type intégral non spécifié suffisant pour contenir la valeur incrémentée.
La phrase en surbrillance peut être montré dans l'exemple suivant:
enum E {
E0 // Unspecified type
, E1 = E0-1 // -1, or MAX_UINT
, E2 // 0 or (MAX_UINT+1)
};
Fondamentalement, le type choisi pour E0
affecte la valeur résultante de E1
.
Compréhensible et logique, je ne vois pas pourquoi quelqu'un éviterait de donner une valeur initiale. Faire cela sans raison vous met à la merci de l'implémentation du compilateur. Affaire au point; dans MSVC 2008, votre E produit: E0 (0), E1 (-1), E2 (0). – Geoff
Comme avec tout ce genre de comportement, les gens supposent parfois que le compilateur fera ce qui est sensé. Et bien sûr, sensible est ce qu'ils * attendent * à se produire. –
Je ne savais même pas que c'était légal ... soigné –
Ce n'est pas vraiment autoréférentiel. Vous avez des membres qui référencent des membres définis précédemment. Les règles ici sont normales - une fois définie, elle est visible. –
J'ai mis à jour la question pour refléter votre point de vue. Merci. :) – Geoff