In C++11 werd het mechanisme 'scoped enums' geïntroduceerd — het sleutelwoord enum class.
Belangrijkste verschillen met klassieke enums:
enum class MyE : uint8_t { ... };).Waarom is het nodig: Voor het verhogen van typeveiligheid, het voorkomen van naamconflicten, onjuiste vergelijkingen en expliciet beheer van opslag.
Voorbeeld:
enum Color { Red, Green }; Color c = Red; // Gewone enum, Red is globaal zichtbaar enum class State { Off, On }; State s = State::On; // Het moet State::On zijn
Je kunt niet schrijven:
enum class State { Off, On }; int x = State::On; // Fout! Alleen met cast int y = static_cast<int>(State::Off); // OK
Waarom kan je geen logische vergelijkingen maken tussen waarden van verschillende enum classes, ook al zijn ze gelijk in naam en onderliggend type?
Antwoord:
Typeveiligheid: elke enum class is een apart type, zelfs als het onderliggende type hetzelfde is en de enumerators overeenkomen in naam. De compiler beschouwt ze als verschillende types en staat geen impliciete vergelijking toe.
Verhaal
Bij de overstap van enum naar enum class in een project voor machinebeheersing, vergaten ze een expliciete conversie toe te voegen bij het afdrukken van waarden in de log. De logs begonnen "vreemde" waarden te tonen (herkende State::On niet als nummer), wat het debuggen bemoeilijkte.
Verhaal
In een REST-service, na de migratie van gewone enums naar enum class, vergeleek de code waarden van verschillende enumeraties uit verschillende enum classes. De compiler stond dit niet toe, automatische tests konden niet meer worden opgebouwd.
Verhaal
In een auditsysteem verwarden ontwikkelaars de oude en nieuwe syntaxis — soms verklaarden ze per ongeluk enum class, maar gebruikten ze de enumerators zonder qualifier, waardoor de verkeerde code werd gecompileerd of linkfouten ontstonden door overeenkomende namen.