Le programme a Comportement indéfini . La valeur de enummy est indéterminée. Conceptuellement, il n'y a pas de différence entre votre code et le code suivant :
int main() {
int i; //indeterminate value
std::cout << i; //undefined behavior
};
Si vous aviez défini votre variable au niveau de l'espace de nom, sa valeur serait initialisée à 0.
enum SomeEnum {
EValue1 = 1,
EValue2 = 4,
};
SomeEnum e; // e is 0
int i; // i is 0
int main()
{
cout << e << " " << i; //prints 0 0
}
Ne soyez pas surpris que e
peut avoir des valeurs différentes de celles de l'un des éléments suivants SomeEnum
Les valeurs de l'énumérateur de l'utilisateur. Chaque type d'énumération possède un type intégral sous-jacent (tel que int
, short
o long
) et l'ensemble des valeurs possibles d'un objet de ce type d'énumération est l'ensemble des valeurs que possède le type intégral sous-jacent. L'énumération est juste un moyen de nommer commodément certaines des valeurs et de créer un nouveau type, mais vous ne limitez pas les valeurs de votre énumération par l'ensemble des valeurs des énumérateurs.
Mise à jour : Quelques citations qui me soutiennent :
Zéro initialisation d'un objet de type T signifie :
- si T est un type scalaire (3.9), l'objet prend la valeur de 0 (zéro) converti en T ;
Notez que les énumérations sont des types scalaires.
Initialiser en valeur un objet de type T signifie :
- si T est un type de classe bla bla bla
- si T est une classe non syndiquée type bla bla
- si T est un type de tableau, alors bla bla bla - sinon, l'objet est zéro initialisé
Donc, nous entrons dans la partie autrement. Et les objets de l'espace de noms sont initialisés par des valeurs.