Поскольку вы вручную приводите 3
к Color
, компилятор позволит вам сделать это. Если вы попытаетесь инициализировать переменную x
простым 3
без приведения, вы получите диагностику.
Обратите внимание, что диапазон значений, которые может хранить перечисление, не ограничен перечислителями, которые он содержит. Это диапазон значений наименьшего битового поля, в котором могут храниться все значения перечислителя перечисления. То есть диапазон вашего типа перечисления составляет 0..3
:
00
01
10
11
Таким образом, значение 3
все еще находится в диапазоне, поэтому код действителен. Если бы вы произвели 4
, то полученное значение было бы не указано стандартом C ++.
На практике реализация должна выбирать базовый целочисленный тип для перечисления. Наименьший тип, который он может выбрать, - char
, но он по-прежнему способен сохранять значения в диапазоне вплоть до 127
. Но, как уже упоминалось, компилятору не требуется преобразовывать 4
в значение 4
, поскольку оно выходит за пределы диапазона перечисления.
Я полагаю, что я должен опубликовать некоторые объяснения различий между "базовым типом" и "диапазоном значений перечисления". Диапазон значений для любого типа является наименьшим и наибольшим значением этого типа. Базовый тип перечисления должен быть в состоянии хранить значение любого перечислителя (конечно) - и два перечисления, которые имеют один и тот же базовый тип, совместимы с компоновкой (это обеспечивает некоторую гибкость в случае несоответствия типов).
Таким образом, хотя базовый тип предназначен для исправления представления объекта (выравнивание и размер), значения перечисления определяются следующим образом в 7.2/6
Для перечисления, где e min - наименьший перечислитель, а e max - наибольший, значения перечисления являются значениями базового типа в диапазоне b min до b max , где b min и b max являются, соответственно, наименьшим и наибольшим значениями наименьшего битового поля, которое может магазин e min и e max . Можно определить перечисление, значения которого не определены ни одним из перечислителей.
[Сноска. На машине с двумя комплементами b max - это наименьшее значение, большее или равное max (abs(
e min ) − 1 ,abs(
e max ))
формы
2 * 1 055 * M * * -1 тысячу пятьдесят шесть; b min равно нулю, если e min неотрицательно и −(
b min +1)
в противном случае.]