Действительно ли нам нужен "класс перечисления" в C++11?
когда у нас есть,
struct E { enum E_ { HELLO }; }; // 'E' is inheritable
тогда зачем нам это нужно,
enum class E { HELLO }; // 'E' is not inheritable
ИМО 2-й версии не предлагает больше возможностей, чем 1-й. Я не думаю, что enum class
вводится только для сохранения 2 фигурных скобок {};
! Я упускаю какой-либо важный аспект ?
как второстепенный вопрос, есть ли разница между enum class
и enum struct
кроме синтаксиса (потому что у обоих есть public
спецификатор доступа) ?
5 ответов:
кроме того, что уже упоминалось, преимущество
enum class
лучше безопасность типа - theenum class
перечислители не преобразуются неявно в целые числа.
действительно ли нам нужен "класс перечисления" в C++0x?
нет, нам не" нужно"
enum class
. Мы можем получить достаточно эквивалентную функциональность другими способами. Но по этой логике, нам не "нужно" много вещей в C++. Нам не нужны виртуальные функции и наследование, так как мы можем просто реализовать его вручную с помощью vtables и т. д. Нам не" нужны " функции-члены; они могут быть эмулированы, если они принимают дополнительный аргумент.языковые функции существуют для сделать жизнь программистов проще. Просто потому что что-то можете быть сделано вручную, не означает, что она должна.
enum class
имеет следующие свойства:
- это легко понять; он отражает, как перечисления работают на других языках.
- это требует относительно мало от компилятора писателей. Сравните усилия по реализации с такими функциями, как ссылки на r-значения, шаблоны varadic или пользовательские литералы.
- это не разбейте синтаксис любым способом. Это может выглядеть немного странно на первый, чтобы увидеть
enum class
, но это верно для большинства новых функций. Как только вы привыкнете к этому, все будет хорошо.- это 100% обратная совместимость, в том, что он не переопределяет, как работают регулярные перечисления. Перечисления старого стиля работают так же, как и раньше.
- это избавляет вас от необходимости писать много шаблонного кода. Boost имеет макрос для создания эффекта
enum class
определений. Без этого макроса вам придется потратить совсем немного усилий, чтобы заставить все угловые случаи работать. И даже так, кто-то пришлось писать и отлаживать этот макрос.так что нет, нам они не" нужны". Но они по-прежнему являются отличным дополнением к языку.
в первом случае, типа
HELLO
неE
, тогда как во втором случае, типаHELLO
иE
.для хорошей демонстрации того, почему это важно, см. ответ Говарда Хиннанта на "эмуляция класса enum"или твердая Альтернатива для MSVC 10.0."
enum class
иenum struct
являются "семантически эквивалентными" (т. е. одинаковыми), согласно C++0x FDIS §7.2/2.
Я думаю, что вы должны прочитать в других преимуществах этих новых перечислений
- пользователь, определенный в размере
- scoped значения (нет более общей области зубрежки значений)
- нет неявного преобразования в целочисленные типы
- прямое объявление перечислений (самое большое улучшение для перечислений в API)
Да, мы делаем. Похоже, никто не указывал на это раньше. Что делать, если вам нужно установить размер
enum
и держать все еще в соответствии со стандартом C++?enum class
можно сделать. И с безопасность типа как уже было сказано. Это уменьшить так много возможных ошибок в коде и беспорядок к смешиваниюint
иenum
s. они никогда не были для меня одним и тем же. Удивительный. например,enum class foo : int16_t { ... }
Я уверен, что каждый член являетсяint16_t
и не до реализации решить, что "лучше" для мне.EDIT:
кроме того, мы можем иметь повторяющиеся значения (не имена) в списке. Что имеет большой смысл в зависимости от контекста.