web-dev-qa-db-fra.com

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

J'ai lu sur la déclaration d'énumération en C++ en utilisant cppreference .

Ensuite, j'ai créé Enum class et vérifié s'il s'agit d'un type de classe ou non en utilisant 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';
}

Ensuite, j'ai compilé et exécuté le compilateur G ++ sur la plate-forme Linux, il affiche la valeur false.

Donc Est-ce que le type de classe enum est ou non? Si enum est un type de classe, alors pourquoi je reçois valeur fausse ?

41
msc

enum class n'est pas une définition de class - la combinaison de mots clés est utilisée pour définir une énumération de portée , qui est une entité complètement distincte de un class.

std::is_class renvoie correctement false ici. Si tu utilises std::is_enum, il renverra true.


De la norme :

Le type d'énumération déclaré avec une clé d'énumération uniquement de enum est une énumération non étendue, et ses énumérateurs sont des énumérateurs non étendus. Les touches enum enum class et enum struct sont sémantiquement équivalents; un type d'énumération déclaré avec l'un d'eux est une énumération de portée, et ses énumérateurs sont des énumérateurs de portée.

Il n'est pas fait mention d'un enum class étant un "class type" n'importe où dans la norme.

46
Vittorio Romeo

Malgré le mot clé class, les énumérations ne sont pas des classes. Ce mot clé signifie uniquement que les énumérateurs doivent respecter certaines règles de portée (et empêchent également les conversions intégrales implicites).

Le choix du mot-clé est dû aux aspects induits par le nouveau type1, et comment les énumérateurs de portée ont été piratés ensemble à l'ère pré-C++ 11, pour obtenir lesdits aspects:

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

Ce qui ne permettait d'accéder aux énumérateurs que via le nom qualifié. Bien que cela n'empêche pas les conversions implicites comme le font les énumérations à portée réelle.

is_class est destiné à identifier les types d'agrégats class/struct.


1 B. Stroustrup - FAQ C++ 11

22
StoryTeller