41 votes

"Enum class" est-il un type de classe en C ++?

J'ai lu sur l'énumération de déclaration en C++ à l'aide de cppreference.

Puis j'ai fait Enum classe et de vérifier si c'est un type de classe ou de ne pas utiliser std::is_class.

#include <iostream>

enum class Enum 
{
    red = 1, blue, green
};

int main() 
{
    std::cout << std::boolalpha;
    std::cout << std::is_class<Enum>::value << '\n';
}

Puis j'ai compilé et exécuté dans G++ compilateur sur une plateforme Linux, il imprime false de la valeur.

Donc, Est - enum type de classe ou pas? Si enum est un type de classe, alors pourquoi je me fais de fausses valeur?

46voto

Vittorio Romeo Points 2559

enum class n'est pas un class définition de la combinaison de mots-clés est utilisé pour définir une étendue d'énumération, qui est une entité totalement distincte à partir d'un class.

std::is_class correctement les retours false ici. Si vous utilisez std::is_enum, il sera de retour true.


À partir de la Norme:

Le type d'énumération déclarée avec un enum-clé de seulement enum est une énumération non délimité, et ses agents recenseurs sont non délimité des agents recenseurs. L'enum clés- enum class et enum struct sont sémantiquement équivalentes; un type d'énumération déclaré à l'un de ces est une étendue d'énumération, et ses agents recenseurs sont limités agents recenseurs.

Il n'est fait mention d'un enum class être un "class "type de n'importe où dans la Norme.

22voto

StoryTeller Points 6139

Malgré l' class mot-clé, les énumérations ne sont pas des classes. Ce mot-clé signifie seulement les agents recenseurs doivent respecter certaines règles de portée (et empêche également implicite partie intégrante des conversions).

Le choix du mot-clé est due à des aspects introduits par le nouveau type1, et de la façon dont l'étendue agents recenseurs ont été bidouillé dans le pré-C++11 ère, pour obtenir ladite aspects:

struct Enum { // could just as well be a class.
  enum {
    red = 1, blue, green
  };
};

Ce qui a permis l'recenseurs pour être accessible via le nom qualifié. Même si cela n'a pas empêcher les conversions implicites comme la véritable étendue des énumérations faire.

is_class sont destinés à identifier les class/struct types de regroupement.


1B. Stroustrup - C++11 FAQ

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