C++11'de 'kapsamlı enumeration' mekanizması tanıtıldı — enum class anahtar kelimesi.
Klasik enum'lardan temel farklar:
enum class MyE : uint8_t { ... };).Neden gereklidir: Tür güvenliğini artırmak, isim çatışmalarını önlemek, hatalı karşılaştırmaları engellemek ve depolamada açık kontrol sağlamak için.
Örnek:
enum Color { Red, Green }; Color c = Red; // Normal enum, Red küresel olarak görünür enum class State { Off, On }; State s = State::On; // State::On belirtmek gerekir
Yazılamaz:
enum class State { Off, On }; int x = State::On; // Hata! Sadece dönüşüm ile int y = static_cast<int>(State::Off); // Tamam
Aynı isim ve temel türü olan farklı enum class'lar arasında mantıksal karşılaştırma neden yapılamaz?
Cevap:
Tür güvenliği: her enum class ayrı bir türdür, altındaki tür aynı olsa bile ve elemanlar isim açısından örtüşse bile. Derleyici bunları farklı türler olarak algılar ve örtük karşılaştırmalara izin vermez.
Tarih
Makine kontrol projesinde enum'dan enum class'a geçerken, log değerlerini çıkarmada açık dönüşüm eklemeyi unuttular. Loglar "yabancı" değerler göstermeye başladı (State::On'ı sayı olarak tanımadı), bu da hata ayıklamayı zorlaştırdı.
Tarih
REST servisinde, sıradan enum'dan enum class'a geçiş sonrası, farklı enum class'lardan çeşitli enumeration değerlerini karşılaştırdı. Derleyici buna izin vermedi, otomatik testler derlenemedi.
Tarih
Denetim sisteminde geliştiriciler eski ve yeni sözdizimini karıştırdılar — bazen kazara enum class tanımladılar, ancak elemanları niteliklendirici olmadan kullandılar, sonuç olarak derlenen kod yanlış oldu veya çakışan isimler nedeniyle bağlantı hataları ortaya çıktı.