Avons-nous vraiment besoin de «enum class» 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 le 1er. Je ne pense pas que la enum class est introduite juste pour sauver 2 accolades {}; ! Est-ce que je manque un aspect important?

En tant que question mineure, existe-t-il une différence entre enum class et enum struct autre que la syntaxe (car les deux ont public spécificateur d’access public )?

Outre ce qui a déjà été mentionné, un avantage de la enum class est la sécurité des types – les enum class ne sont pas convertis implicitement en entiers.

Avons-nous vraiment besoin de «enum class» en C ++ 0x?

Non, nous n’avons pas besoin de la enum class . Nous pouvons obtenir des fonctionnalités suffisamment équivalentes par d’autres moyens. Mais par cette logique, nous n’avons pas besoin de beaucoup de choses en C ++. Nous n’avons pas “besoin” de fonctions virtuelles et d’inheritance, puisque nous pouvons simplement l’implémenter manuellement avec des vtables et autres. Nous n’avons pas besoin de fonctions membres; ceux-ci peuvent être imités en leur demandant de prendre un argument supplémentaire.

Les fonctionnalités linguistiques existent pour faciliter la vie des programmeurs. Ce n’est pas parce que quelque chose peut être fait manuellement que cela devrait être fait.

enum class a les propriétés suivantes:

  1. C’est facile à comprendre; cela reflète le fonctionnement des énumérations dans d’autres langues.
  2. Il nécessite relativement peu des auteurs de compilateurs. Contrastez 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 brise en rien la syntaxe. Cela peut sembler bizarre au début de voir la enum class , mais c’est vrai pour la plupart des nouvelles fonctionnalités. Une fois que vous vous y habituez, ç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 vieux enums fonctionnent comme avant.
  5. Cela vous évite d’avoir à écrire beaucoup de code standard. Boost a une macro pour créer l’effet des définitions de enum class . Sans cette macro, vous devez consacrer beaucoup d’efforts pour que tous les dossiers soient opérationnels. Et même ainsi, quelqu’un a dû écrire et déboguer cette macro.

Donc non, nous ne les avons pas “besoin”. Mais ils sont toujours un excellent ajout à la langue.

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 l’importance de cet aspect, consultez la réponse d’Howard Hinnant à l’ émulation «enum class» ou à l’alternative solide pour MSVC 10.0.

enum class et enum struct sont “sémantiquement équivalentes” (c’est-à-dire identiques), conformément à C ++ 0x FDIS § 7.2.2.

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

  • taille définie par l’utilisateur
  • valeurs scopées (pas plus de scopes générales sur les valeurs)
  • pas de conversion implicite en types intégraux
  • déclaration à terme des énumérations (la plus grande amélioration pour les énumérations dans les API)

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

Oui. On dirait que personne ne l’a déjà fait remarquer. Qu’en est-il si vous devez définir la taille d’un enum et restr immobile conformément à la norme C ++? enum class peut faire. Et avec le type de sécurité comme déjà mentionné. Cela réduit le nombre de bogues possibles dans le code et le gâchis associé au mixage entre int et enum s. Ce n’était pas 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 mise en œuvre de décider ce qui est “meilleur” pour moi.

MODIFIER:

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