#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).