web-dev-qa-db-fra.com

Avons-nous vraiment besoin d'une "classe d'énumération" en C ++ 11?

Quand nous avons,

struct E { enum E_ { HELLO }; }; // 'E' is inheritable

alors pourquoi avons-nous besoin,

enum class E { HELLO };  // 'E' is not inheritable

IMO 2nd version n'offre pas plus de fonctionnalités que la 1st. Je ne pense pas que enum class est introduit juste pour sauver 2 accolades {};! Suis-je en train de manquer un aspect important?

Comme question mineure, existe-t-il une différence entre enum class et enum struct autre que la syntaxe (parce que les deux ont public spécificateur d'accès)?

60
iammilind

Outre ce qui a déjà été mentionné, un avantage de enum class c'est mieux type sécurité - le enum class les énumérateurs ne se convertissent pas implicitement en entiers.

125
Kos

Avons-nous vraiment besoin de "classe énum" en C++ 0x?

Non, nous n'avons pas "besoin" enum class. Nous pouvons obtenir des fonctionnalités suffisamment équivalentes par d'autres moyens. Mais selon cette logique, nous n'avons pas "besoin" de beaucoup de choses en C++. Nous n'avons pas "besoin" de fonctions virtuelles et d'héritage, car nous pouvons simplement l'implémenter manuellement avec vtables et autres. Nous n'avons pas "besoin" de fonctions membres; ceux-ci peuvent être émulés en leur faisant prendre un argument supplémentaire.

Les fonctionnalités du langage existent pour faciliter la vie des programmeurs. Ce n'est pas parce que quelque chose peut être fait manuellement que cela doit l'être.

enum class a les propriétés suivantes:

  1. C'est facile à comprendre; il reflète le fonctionnement des énumérations dans d'autres langues.
  2. Il nécessite relativement peu de rédacteurs de compilateur. Comparez l'effort d'implémentation avec des fonctionnalités telles que les références de valeur r, les modèles varadic ou les littéraux définis par l'utilisateur.
  3. Cela ne casse en rien la syntaxe. Cela peut sembler un peu bizarre au début de voir enum class, mais cela est vrai pour la plupart des nouvelles fonctionnalités. Une fois que vous vous y êtes habitué, ça va.
  4. Il est 100% rétrocompatible, en ce sens qu'il ne redéfinit pas le fonctionnement des énumérations régulières. Les énumérations à l'ancienne fonctionnent de la même manière qu'auparavant.
  5. Cela vous évite d'avoir à écrire beaucoup de code passe-partout. Boost a une macro pour créer l'effet de enum class définitions. Sans cette macro, vous devez consacrer beaucoup d'efforts à faire fonctionner tous les cas d'angle. Et même ainsi, quelqu'un a dû écrire et déboguer cette macro.

Donc non, nous n'en avons pas "besoin". Mais ils sont toujours un excellent ajout à la langue.

93
Nicol Bolas

Dans le premier cas, le type de HELLO n'est pas E, alors que dans le second cas, le type de HELLO est E.

Pour une bonne démonstration de pourquoi c'est important, voir la réponse de Howard Hinnant à "émulation" enum class "ou alternative solide pour MSVC 10.0."

enum class et enum struct sont "sémantiquement équivalents" (c'est-à-dire les mêmes), selon C++ 0x FDIS §7.2/2.

24
James McNellis

Je pense que vous devez lire les autres avantages de ces nouvelles énumérations

  • taille définie par l'utilisateur
  • valeurs de portée (plus de portée générale de cramming de valeurs)
  • pas de conversion implicite en types intégraux
  • déclaration à terme des énumérations (amélioration la plus importante pour les énumérations dans les API)

http://www.stroustrup.com/C++11FAQ.html#enum

16
David

Oui. On dirait que personne ne l'a signalé auparavant. Qu'en est-il si vous devez définir la taille d'un enum et rester immobile selon la norme C++? enum class peut faire. Et avec type sécurité comme déjà mentionné. Cela réduit autant de bogues possibles dans le code et le désordre en mélangeant int et enums. Ce n'était jamais la même chose pour moi. Incroyable. par exemple., enum class foo : int16_t { ... } Je suis sûr que chaque membre est un int16_t et non à la mise en œuvre, décidez ce qui est "mieux" pour moi.

MODIFIER:

De plus, nous pouvons avoir des valeurs dupliquées (pas des noms) dans la liste. Ce qui a beaucoup de sens selon le contexte.

2
The Mask