60 votes

Avons-nous vraiment besoin « enum class » dans 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
 

La deuxième version d'OMI n'offre pas plus de fonctionnalités que la première. Je ne pense pas que enum class est introduit uniquement pour économiser 2 accolades {}; ! Est-ce que je manque un aspect important?

Question mineure, y a-t-il une différence entre enum class et enum struct autre que la syntaxe (car les deux ont un spécificateur d'accès public )?

125voto

Kos Points 29125

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

93voto

Nicol Bolas Points 133791

Avons-nous vraiment besoin "enum class" dans C++0x?

Non, nous n'avez pas "besoin" enum class. Nous pouvons obtenir suffisamment de fonctionnalités équivalentes dans d'autres façons. Mais par cette logique, nous ne sommes pas "besoin" d'un tas de trucs en C++. Nous n'avons pas "besoin" de fonctions virtuelles et à l'héritage, puisque l'on peut mettre en œuvre manuellement avec les vtables et ces. Nous ne sommes pas "besoin" les fonctions de membres; ceux-ci peuvent être émulé en leur demandant de prendre un argument supplémentaire.

Fonctionnalités de la langue existent pour vous faciliter la vie des programmeurs. Juste parce que quelque chose peut être fait manuellement ne veut pas dire qu'il le devrait.

enum class a les propriétés suivantes:

  1. Il est facile à comprendre; il reflète la manière dont les énumérations de travail dans d'autres langues.
  2. Il exige relativement peu de rédacteurs du compilateur. Le contraste de la mise en œuvre d'efforts avec des fonctionnalités telles que la r-valeur de références, varadic modèles, ou définis par l'utilisateur littéraux.
  3. Il ne rompt pas la syntaxe en aucune façon. Il peut paraître un peu bizarre au début de voir enum class, mais c'est vrai pour la plupart des nouvelles fonctionnalités. Une fois que vous vous habituez à elle, c'est la fin.
  4. Il est 100% compatible, en ce qu'elle n'est pas de redéfinir la manière dont les énumérations de travail. De style ancien enums fonctionnent de la même façon qu'auparavant.
  5. Il vous permet d'éviter d'avoir à écrire beaucoup de code réutilisable. Boost a une macro pour créer l'effet d' enum class définitions. Sans cette macro, vous devez passer un peu d'effort de tous les cas de coin pour travailler. Et même si, quelqu'un a dû écrire et déboguer cette macro.

Donc, non, nous ne sommes pas "besoin" d'eux. Mais ils sont toujours un excellent ajout à la langue.

24voto

James McNellis Points 193607

Dans le premier cas, le type d' HELLO n'est E, tandis que dans le second cas, le type d' HELLO est E.

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

enum class et enum struct sont "sémantiquement équivalentes" (c'est à dire, le même), par C++0x FDIS §7.2/2.

16voto

David Points 1773

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

  • taille définie par l’utilisateur
  • étendue des valeurs (pas plus générale portée bachotage des valeurs)
  • pas de conversion implicite de types intégraux
  • déclaration anticipée des enums (plus grande amélioration pour les énumérations dans l’API)

http://www2.Research.att.com/~BS/C++0xFAQ.html#enum

2voto

The Mask Points 5925

Oui, nous le faisons. On dirait que personne a souligné cette avant. Si vous avez besoin de définir la taille de l' enum et de garder toujours selon norme C++? enum class peut faire. Et avec le type de sécurité comme déjà mentionné. C'est réduire beaucoup de bugs dans le code et le désordre de mixage int et enums. Ils n'est pas 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 pas à la hauteur de la mise en œuvre de décider quelle est la "meilleure" pour moi.

EDIT:

Aussi, nous pouvons avoir des doublons (pas de noms) dans la liste. Qui font beaucoup de sens en fonction du contexte.

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