Преобразовать enum с областью видимости в int

Почему нельзя перечислить enum с областью видимости в int неявно? Если у меня есть

enum class Foo:uint32_t{...};

Тогда я знаю, что целые числа, охватываемые Foo, являются подмножеством целых чисел, охватываемых uint32_t, поэтому я всегда должен быть в безопасности. Я что-то упустил здесь? Противоположность не может быть безопасной, хотя.

2

Решение

То, что такое преобразование всегда может быть успешным, не означает, что вы хотите, чтобы оно было неявным.

Вся цель перечислений с областью видимости состоит в том, что они представляют собой отдельные типы, которые не приведут к сбивающим с толку результатам при разрешении перегрузки.

Быть явным — это хорошо.

6

Другие решения

Как объясняет 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!
5

По вопросам рекламы [email protected]