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

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

Появятся ли новые объявления класса "enum class" в С++ 0x, чтобы включить новые переплетенные перечисления?

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

4b9b3361

Ответ 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, old style) в контексте оператора switch.

n3242 - 6.4.2.2 [stmt.switch]:

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

case constant-expression :

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

В случае условия перечисляется тип перечисления. Это включает как скопированные, так и неперечисленные числа (см. N3242 - 7.2).

Что касается меток case, они должны быть неотъемлемыми постоянными выражениями. Который является постоянным выражением интегрального или перечисляемого типа (см. N3242 - 5.19.3).