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?
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.
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üsselenum class
undenum 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.
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.