Действительно ли нам нужен "класс перечисления" в 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 59

5 ответов:

кроме того, что уже упоминалось, преимущество enum class лучше безопасность типа - the enum class перечислители не преобразуются неявно в целые числа.

действительно ли нам нужен "класс перечисления" в C++0x?

нет, нам не" нужно"enum class. Мы можем получить достаточно эквивалентную функциональность другими способами. Но по этой логике, нам не "нужно" много вещей в C++. Нам не нужны виртуальные функции и наследование, так как мы можем просто реализовать его вручную с помощью vtables и т. д. Нам не" нужны " функции-члены; они могут быть эмулированы, если они принимают дополнительный аргумент.

языковые функции существуют для сделать жизнь программистов проще. Просто потому что что-то можете быть сделано вручную, не означает, что она должна.

enum class имеет следующие свойства:

  1. это легко понять; он отражает, как перечисления работают на других языках.
  2. это требует относительно мало от компилятора писателей. Сравните усилия по реализации с такими функциями, как ссылки на r-значения, шаблоны varadic или пользовательские литералы.
  3. это не разбейте синтаксис любым способом. Это может выглядеть немного странно на первый, чтобы увидеть enum class, но это верно для большинства новых функций. Как только вы привыкнете к этому, все будет хорошо.
  4. это 100% обратная совместимость, в том, что он не переопределяет, как работают регулярные перечисления. Перечисления старого стиля работают так же, как и раньше.
  5. это избавляет вас от необходимости писать много шаблонного кода. Boost имеет макрос для создания эффекта enum class определений. Без этого макроса вам придется потратить совсем немного усилий, чтобы заставить все угловые случаи работать. И даже так, кто-то пришлось писать и отлаживать этот макрос.

так что нет, нам они не" нужны". Но они по-прежнему являются отличным дополнением к языку.

в первом случае, типа HELLO не E, тогда как во втором случае, типа HELLO и E.

для хорошей демонстрации того, почему это важно, см. ответ Говарда Хиннанта на "эмуляция класса enum"или твердая Альтернатива для MSVC 10.0."

enum class и enum struct являются "семантически эквивалентными" (т. е. одинаковыми), согласно C++0x FDIS §7.2/2.

Я думаю, что вы должны прочитать в других преимуществах этих новых перечислений

  • пользователь, определенный в размере
  • scoped значения (нет более общей области зубрежки значений)
  • нет неявного преобразования в целочисленные типы
  • прямое объявление перечислений (самое большое улучшение для перечислений в API)

http://www.stroustrup.com/C++11FAQ. html#enum

Да, мы делаем. Похоже, никто не указывал на это раньше. Что делать, если вам нужно установить размер enum и держать все еще в соответствии со стандартом C++? enum class можно сделать. И с безопасность типа как уже было сказано. Это уменьшить так много возможных ошибок в коде и беспорядок к смешиванию int и enums. они никогда не были для меня одним и тем же. Удивительный. например, enum class foo : int16_t { ... } Я уверен, что каждый член является int16_t и не до реализации решить, что "лучше" для мне.

EDIT:

кроме того, мы можем иметь повторяющиеся значения (не имена) в списке. Что имеет большой смысл в зависимости от контекста.