Действительно ли нам нужен "enum class" в C ++ 11? - PullRequest
60 голосов
/ 04 августа 2011

Когда у нас есть

struct E { enum E_ { HELLO }; }; // 'E' is inheritable

, тогда зачем нам,

enum class E { HELLO };  // 'E' is not inheritable

ИМО, вторая версия не предлагает больше возможностей, чем первая.Я не думаю, что enum class введен только для того, чтобы сохранить 2 фигурные скобки {};!Я пропускаю какой-либо важный аспект?

В качестве второстепенного вопроса, есть ли разница между enum class и enum struct, кроме синтаксиса (потому что оба имеют public спецификатор доступа)?

Ответы [ 5 ]

125 голосов
/ 04 августа 2011

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

93 голосов
/ 04 августа 2011

Действительно ли нам нужен «enum class» в C ++ 0x?

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

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

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

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

Так нет, нам они не «нужны». Но они все еще являются отличным дополнением к языку.

24 голосов
/ 04 августа 2011

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

Для хорошей демонстрации того, почему этоважно, см. ответ Говарда Хиннанта на «эмуляцию« enum class »или твердую альтернативу для MSVC 10.0.»то же самое), согласно C ++ 0x FDIS § 7.2 / 2.

16 голосов
/ 04 августа 2011

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

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

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

2 голосов
/ 19 марта 2014

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

EDIT:

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

...