2 votes

Les nouveaux types d'énumération sont-ils définis pour commencer à 0 ?

Étant donné le code C++11 suivant

enum class Foods {
  Apple,
  Pear,
  Banana
};

volonté

std::cout << (unsigned int)Foods::Apple << std::endl;

sortie 0 ?

C'est vrai pour MSVC 2012 et gcc 4.7.0, mais je suis plus intéressé par ce que le standard C++11 spécifie sur lequel nous pouvons compter. En d'autres termes, le code portable peut-il dépendre d'énumérations dont la valeur par défaut est 0 pour la valeur du premier élément ?

6voto

Praetorian Points 47122

La norme ne fait pas de distinction entre les énumérations scopées et non scopées lorsqu'il s'agit de la valeur du premier énumérateur qui ne spécifie pas d'initialisateur.

D'après §7.2/2 [dcl.enum]

Le type d'énumération déclaré avec un clé-énum de seulement enum i est une énumération sans échelle, et son énumérateurs sont énumérateurs non codés . Les clés énumérées enum class et enum struct a un type d'énumération déclaré avec l'un de ces types est un type d'énumération s énumération et son énumérateurs sont énumérateurs cadrés . [...] Si le premier énumérateur n'a pas initialisateur la valeur du est nulle . [...]

5voto

Dietmar Kühl Points 70604

L'initialisation des valeurs de l'énumération n'a pas changé : À moins que vous ne donniez une valeur initiale différente, elles commenceront par zéro et compteront à partir de la valeur précédente. La section concernée se trouve dans 7.2 [dcl.enum] paragraphe 2 :

Si le premier énumérateur n'a pas d'initialisateur, la valeur de la constante correspondante est zéro. Une définition d'énumérateur sans initialisateur donne à l'énumérateur la valeur obtenue en augmentant de un la valeur de l'énumérateur précédent.

4voto

je4d Points 4591

Oui, ils le sont. C'est au §7.2/2 :

[...] Si le premier énumérateur n'a pas d'initialisateur, la valeur de la constante correspondante est zéro. Une définition d'énumérateur sans initialisateur donne à l'énumérateur la valeur obtenue en augmentant de un la valeur de l'énumérateur précédent.

Cette section couvre à la fois enum class et les déclarations régulières enum déclarations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X