wake-up-neo.com

Ist "enum class" ein Klassentyp in C ++?

Ich habe über die Enumerationsdeklaration in C++ mit cppreference gelesen.

Dann habe ich eine Enum-Klasse erstellt und mit std::is_class Überprüft, ob es sich um einen Klassentyp handelt oder nicht.

#include <iostream>

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

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

Dann kompilierte ich und lief in G ++ Compiler auf Linux-Plattform, es gibt false Wert.

Also Ist enum Klassentyp oder nicht? Wenn enum ein Klassentyp ist, warum erhalte ich dann falscher Wert?

41
msc

enum class ist keine class -Definition - die Kombination von Schlüsselwörtern wird verwendet, um eine bereichsspezifische Aufzählung zu definieren, von der eine vollständig separate Entität ist a class.

std::is_class gibt hier false korrekt zurück. Wenn du benutzt std::is_enum, es wird true zurückgegeben.


Aus dem Standard :

Der Aufzählungstyp, der mit einem Aufzählungsschlüssel von nur enum deklariert wurde, ist eine Aufzählung ohne Gültigkeitsbereich, und seine Aufzählungszeichen sind Aufzählungszeichen ohne Gültigkeitsbereich. Die Aufzählungsschlüssel enum class und enum struct sind semantisch äquivalent; Ein mit einem dieser Typen deklarierter Aufzählungstyp ist eine Aufzählung mit Gültigkeitsbereichen, und seine Aufzählungszeichen sind Aufzählungszeichen mit Gültigkeitsbereichen.

Es gibt keine Erwähnung eines enum class ist ein "class Typ" irgendwo im Standard.

46
Vittorio Romeo

Aufzählungen sind trotz des Schlüsselworts class keine Klassen. Dieses Schlüsselwort bedeutet nur, dass die Enumeratoren bestimmte Gültigkeitsregeln einhalten müssen (und implizite integrale Konvertierungen verhindern).

Die Wahl des Schlüsselworts hängt von den Aspekten ab, die der neue Typ mit sich bringt1und wie bereichsspezifische Enumeratoren in der Zeit vor C++ 11 zusammen gehackt wurden, um die folgenden Aspekte zu erhalten:

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

Auf die Enumeratoren konnte nur über den qualifizierten Namen zugegriffen werden. Dies hat jedoch implizite Konvertierungen nicht verhindert, wie dies bei Aufzählungen mit echtem Umfang der Fall ist.

is_class soll die Klassen-/Strukturaggregattypen identifizieren.


1 B. Stroustrup - C++ 11 FAQ

22
StoryTeller