Почему нельзя перечислить enum с областью видимости в int неявно? Если у меня есть
enum class Foo:uint32_t{...};
Тогда я знаю, что целые числа, охватываемые Foo, являются подмножеством целых чисел, охватываемых uint32_t, поэтому я всегда должен быть в безопасности. Я что-то упустил здесь? Противоположность не может быть безопасной, хотя.
То, что такое преобразование всегда может быть успешным, не означает, что вы хотите, чтобы оно было неявным.
Вся цель перечислений с областью видимости состоит в том, что они представляют собой отдельные типы, которые не приведут к сбивающим с толку результатам при разрешении перегрузки.
Быть явным — это хорошо.
Как объясняет LightnessRacesinOrbit в своем ответ, вся цель ограниченных перечислений — запретить неявное преобразование в базовый тип.
Вы можете конвертировать их явно через static_cast
, но если вам нужна возможность указать базовый тип, разрешая неявные преобразования, вы можете сделать это и с обычными перечислениями, просто удалите class
Ключевое слово из определения.
enum class Foo1 : uint32_t{ THING };
enum /*class*/ Foo2 : uint32_t{ THING };
uint32_t conv1 = static_cast<uint32_t>(Foo1::THING);
uint32_t conv2 = Foo2::THING; // <-- implicit conversion!