Подтвердить что ты не робот

Нам действительно нужен "enum class" в С++ 11?

Когда мы имеем,

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)?

4b9b3361

Ответ 1

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

Ответ 2

Нам действительно нужен "класс enum" в С++ 0x?

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

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

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

  • Легко понять; он отражает, как перечисления работают на других языках.
  • Для составителей компилятора это относительно мало. Сравните усилия по реализации с такими функциями, как ссылки на r-значение, шаблоны varadic или определенные пользователем литералы.
  • Он никак не нарушает синтаксис. Вначале может показаться немного странным, чтобы увидеть enum class, но это верно для большинства новых функций. Как только вы привыкнете к этому, все хорошо.
  • Это 100% обратная совместимость, поскольку она не переопределяет, как работают регулярные перечисления. Режимы старого стиля работают так же, как и раньше.
  • Это не дает вам написать много шаблонов. У Boost есть макрос, чтобы создать эффект enum class. Без этого макроса вам придется потратить немало усилий, чтобы все угловые случаи работали. И даже так, кто-то должен был написать и отладить этот макрос.

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

EDIT:

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