Ответ 1
Кроме того, что уже упоминалось, преимущество enum class
лучше типа безопасности - перечисления enum class
не преобразуются неявно в целые числа.
Когда мы имеем,
struct E { enum E_ { HELLO }; }; // 'E' is inheritable
то зачем нам нужно,
enum class E { HELLO }; // 'E' is not inheritable
Вторая версия IMO не предлагает больше возможностей, чем первая. Я не думаю, что enum class
вводится только для сохранения 2 фигурных скобок {};
! Не хватает ли какого-либо важного аспекта?
Как второстепенный вопрос, существует ли разница между enum class
и enum struct
, отличным от синтаксиса (поскольку оба имеют спецификатор доступа public
)?
Кроме того, что уже упоминалось, преимущество enum class
лучше типа безопасности - перечисления enum class
не преобразуются неявно в целые числа.
Нам действительно нужен "класс enum" в С++ 0x?
Нет, мы не нуждаемся в enum class
. Мы можем получить достаточно эквивалентную функциональность другими способами. Но по этой логике мы не нуждаемся в большом количестве вещей на С++. Мы не нуждаемся в виртуальных функциях и наследовании, поскольку мы можем просто реализовать его вручную с помощью vtables и т.д. Нам не нужны "функции-члены"; их можно эмулировать, если они возьмут дополнительный аргумент.
Существуют языковые функции, облегчающие жизнь программистов. Просто потому, что что-то можно сделать вручную, это не значит, что он должен.
enum class
имеет следующие свойства:
enum class
, но это верно для большинства новых функций. Как только вы привыкнете к этому, все хорошо.enum class
. Без этого макроса вам придется потратить немало усилий, чтобы все угловые случаи работали. И даже так, кто-то должен был написать и отладить этот макрос.Так что нет, мы не "нуждаемся" в них. Но они все еще отличное дополнение к языку.
В первом случае тип HELLO
не E
, тогда как во втором случае тип HELLO
равен E
.
Для хорошей демонстрации того, почему это важно, см. Howard Hinnant ответ на "эмуляцию класса enum или твердую альтернативу для MSVC 10.0."
enum class
и enum struct
являются "семантически эквивалентными" (т.е. одинаковыми), для С++ 0x FDIS §7.2/2.
Я думаю, вам нужно прочитать в других преимуществах этих новых перечислений
Да, мы делаем. Похоже, никто этого не заметил. Как насчет того, если вам нужно установить размер enum
и сохранить в соответствии со стандартом С++? enum class
может сделать. И с безопасностью типа, как уже упоминалось. Это уменьшает количество возможных ошибок в коде и беспорядок до смешивания int
и enum
s. Для меня они никогда не были одинаковыми. Удивительно. например, enum class foo : int16_t { ... }
Я уверен, что каждый член int16_t
, а не до реализации, решает, что для меня "лучше".
EDIT:
Кроме того, мы можем иметь дублированные значения (а не имена) в списке. Это имеет большое значение в зависимости от контекста.