Die Aufzählungsklassen ("neue Aufzählungen", "starke Aufzählungen") behandeln drei Probleme mit herkömmlichen C ++ - Aufzählungen:
- konventionell
enums
implizit konvertieren in int
, was zu Fehlern führt, wenn jemand nicht möchte, dass eine Aufzählung als Ganzzahl fungiert.
- konventionelle
enums
exportieren ihre Enumeratoren in den umgebenden Bereich, was zu Namenskonflikten führt.
- Der zugrunde liegende Typ von a
enum
kann nicht angegeben werden, was zu Verwirrung und Kompatibilitätsproblemen führt und eine Vorwärtsdeklaration unmöglich macht.
enum class
("starke Aufzählungen") sind stark typisiert und haben einen Gültigkeitsbereich:
enum Alert { green, yellow, orange, red }; // traditional enum
enum class Color { red, blue }; // scoped and strongly typed enum
// no export of enumerator names into enclosing scope
// no implicit conversion to int
enum class TrafficLight { red, yellow, green };
Alert a = 7; // error (as ever in C++)
Color c = 7; // error: no int->Color conversion
int a2 = red; // ok: Alert->int conversion
int a3 = Alert::red; // error in C++98; ok in C++11
int a4 = blue; // error: blue not in scope
int a5 = Color::blue; // error: not Color->int conversion
Color a6 = Color::blue; // ok
Wie gezeigt, funktionieren herkömmliche Aufzählungen wie gewohnt, aber Sie können sich jetzt optional mit dem Namen der Aufzählung qualifizieren.
Die neuen Aufzählungen sind "Aufzählungsklassen", da sie Aspekte traditioneller Aufzählungen (Namenswerte) mit Aspekten Klassen (Mitglieder mit Gültigkeitsbereich und Fehlen von Konvertierungen) kombinieren.
Die Möglichkeit, den zugrunde liegenden Typ anzugeben, ermöglicht eine einfachere Interoperabilität und garantierte Aufzählungsgrößen:
enum class Color : char { red, blue }; // compact representation
enum class TrafficLight { red, yellow, green }; // by default, the underlying type is int
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U }; // how big is an E?
// (whatever the old rules say;
// i.e. "implementation defined")
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U }; // now we can be specific
Es ermöglicht auch die Vorwärtsdeklaration von Aufzählungen:
enum class Color_code : char; // (forward) declaration
void foobar(Color_code* p); // use of forward declaration
// ...
enum class Color_code : char { red, yellow, green, blue }; // definition
Der zugrunde liegende Typ muss einer der vorzeichenbehafteten oder vorzeichenlosen Ganzzahltypen sein. Der Standardwert ist int
.
In der Standardbibliothek werden enum
Klassen verwendet für:
- Zuordnungssystemspezifische Fehlercodes: In
<system_error>
: enum class errc
;
- Zeigersicherheitsindikatoren: In
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- E / A-Stream-Fehler: In
<iosfwd>
:enum class io_errc { stream = 1 };
- Fehlerbehandlung bei asynchroner Kommunikation: In
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Einige von diesen haben Operatoren, wie z. B. ==
definiert.
enum class Colours
undenum class Fruits
. Denn als ich den Code in VS 2010 geschrieben habe, wirft er einen Fehler"expects a defination or a tag name"
unterclass
.