Включение класса enum в C 0x

#c #enums #c 11

#c #перечисления #c 11

Вопрос:

Позволят ли новые объявления «enum class» в C 0x включить новомодные перечисления?

Я спрашиваю, что говорится в стандарте, а не о поддержке компилятора.

Комментарии:

1. @Close-voter: Почему это не по теме?

Ответ №1:

Из черновика n3242:

6.4.2 Оператор switch [stmt.switch]

[…]

2 Условие должно иметь целочисленный тип, тип перечисления или тип класса, для которого существует единственная неявная функция преобразования в целочисленный тип или тип перечисления (12.3).

7.2 Объявления перечислений [dcl.enum]

[…]

 enum-key:
    enum
    enum class
    enum struct
  

Это означает, что да.

Ответ №2:

Да, ограниченные (enum {class, struct}) перечисления и перечислители будут вести себя точно так же, как и не ограниченные (enum, старый стиль) перечисления в контексте инструкции switch.

n3242 — 6.4.2.2 [stmt.switch]:

Условие должно иметь целочисленный тип, тип перечисления или тип класса, для которого существует единственная неявная функция преобразования в целочисленный тип или тип перечисления (12.3). Если условие имеет тип class, условие преобразуется путем вызова этой функции преобразования, и результат преобразования используется вместо исходного условия для остальной части этого раздела. Выполняются интегральные продвижения. Любой оператор в инструкции switch может быть помечен одним или несколькими метками регистра следующим образом:

 case constant-expression :
  

где константа-выражение должно быть целым постоянным выражением (5.19). Целочисленное константное выражение неявно преобразуется в повышенный тип условия переключения. Нет двух констант case в
тот же переключатель должен иметь то же значение после преобразования в повышенный тип условия переключения.

В случае выполнения условия указывается тип перечисления. Сюда входят перечисления как с ограниченной, так и с не ограниченной областью действия (см. n3242 — 7.2).

Что касается меток case, то они должны быть целыми постоянными выражениями. Который является постоянным выражением целочисленного или перечисляющего типа (см. n3242 — 5.19.3).