Появятся ли новые объявления класса "enum class" в С++ 0x, чтобы включить новые переплетенные перечисления?
Я спрашиваю, что говорит стандарт, а не о поддержке компилятора.
Появятся ли новые объявления класса "enum class" в С++ 0x, чтобы включить новые переплетенные перечисления?
Я спрашиваю, что говорит стандарт, а не о поддержке компилятора.
Из черновика n3242:
6.4.2 Оператор switch [stmt.switch]
[...]
2 Условие должно быть целочисленным типом, типом перечисления или типом класса, для которого один неявный существует функция преобразования в интегральный или перечисляемый тип (12.3).
7.2 Объявления перечисления [dcl.enum]
[...]
enum-key:
enum
enum class
enum struct
Это означает, что да.
Да, перечисления и перечисления с областью (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).