В C++11 был введён механизм 'scoped enums' — ключевое слово enum class.
Основные отличия от классических enum:
enum class MyE : uint8_t { ... };).Зачем нужен: Для повышения безопасности типов, предотвращения конфликтов имён, ошибочных сравнений и явного управления хранением.
Пример:
enum Color { Red, Green }; Color c = Red; // Обычный enum, Red виден глобально enum class State { Off, On }; State s = State::On; // Нужно указывать State::On
Нельзя писать:
enum class State { Off, On }; int x = State::On; // Ошибка! Только с кастом int y = static_cast<int>(State::Off); // OK
Почему нельзя сделать логическое сравнение между значениями разных enum class, даже если они совпадают по именам и подлежащему типу?
Ответ:
Тип безопасности: каждая enum class — отдельный тип, даже если подлежащий тип один и перечислители совпадают по именам. Компилятор воспримет их как разные типы и не допустит неявное сравнение.
История
Переходя с enum на enum class в проекте управления станками, забыли добавить явное преобразование при выводе значений в лог. Логи начали показывать "чужеродные" значения (не распознавали State::On как число), что усложнило отладку.
История
В REST-сервисе после миграции обычного enum на enum class код сравнивал значения различных перечислений из разных enum class. Компилятор не допускал это, автоматические тесты перестали собираться.
История
В системе аудита разработчики путали старый и новый синтаксис — иногда нечаянно объявляли enum class, но использовали перечислители без квалификатора, в итоге компилировался не тот код или возникали ошибки линковки из-за совпадающих имён.