Безопасно ли приводить произвольные значения базового типа к типу перечисления со строгим типом? - PullRequest
14 голосов
/ 07 августа 2011

Если у меня есть строго типизированное перечисление, скажем, базового типа int, можно ли привести значение int, которое не соответствует ни одному перечислителю, к типу перечисления?

enum e1 : int { x = 0, y = 1 };
enum class e2 : int { x = 0, y = 1 };

int main() {
        e1 foo = static_cast<e1>(42); // is this UB?
        e2 bar = static_cast<e2>(42);
}

1 Ответ

16 голосов
/ 07 августа 2011

Из n3290, 5.2.9 Статическое приведение [expr.static.cast]:

10 Значение целочисленного типа или типа перечисления может быть явно преобразовано в тип перечисления.Значение не изменяется, если исходное значение находится в диапазоне значений перечисления (7.2).В противном случае результирующее значение не определено (и может не входить в этот диапазон).[...]

Тип перечисления включает как типы, объявленные с enum, так и типы, объявленные с enum class или enum struct, которые стандартвызывает соответственно перечисления unscoped и перечисления scoped .Более подробно описано в 7.2 объявлениях перечисления [dcl.enum].

Значения типа перечисления не следует путать с его перечислителями .В вашем случае, поскольку все перечисленные вами перечисления имеют int в качестве базовых типов, диапазон значений такой же, как у int: от INT_MIN до INT_MAX (включительно).

Поскольку 42 имеет тип int и, очевидно, является значением int, поведение определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...