[dcl.enum] / 8:
Для перечисления, базовый тип которого является фиксированным, значения перечисления являются значениями базового типа.
Все enum class
имеют фиксированный базовый тип;либо явное, либо int, если не указано явно.
Таким образом, они гарантированно смогут хранить все, что может их базовый тип.
Перечисления с незаданной областью (enum
без class
или struct
) имеют разные правила;их действительные значения в основном являются двоичным кубом дополнения 2s значений перечислителя.Если бы ваше перечисление было незаданным, его значение равным 3. не было бы переносимым.
Я подозреваю, что это правило для перечислений с ограниченным пространством было сделано для того, чтобы в некотором смысле было легче проверить правильность;они гарантированно являются целым типом.Проверка правильности использования enum с незаданной областью была трудной .Это означает, что вы не можете, как программист, предполагать, что перечисления находятся только в состоянии своих перечисляемых значений;но гарантируя, что это разрушит множество вариантов использования enum и будет трудно гарантировать практически.
Вы, вероятно, могли бы сделать предложение для строгого enum, которое может быть только в названных государствах, если вы видите огромныйпреимущество от этого.
Для перечислений без области действия: [dcl.enum] 7.2 / 8
Для перечисления, базовый тип которого является фиксированным, значения перечисления являются значениямибазового типа.В противном случае для перечисления, где e_min - наименьший перечислитель, а e_max - наибольший, значения перечисления - это значения в диапазоне от b_min до b_max, определяемые следующим образом: пусть K будет 1 для представления дополнения до двух и 0 для единицыдополнение или представление величины знака.b_max является наименьшим значением, большим или равным max (| e_min | - K, | e_max |) и равным 2 ^ M - 1, где M - неотрицательное целое число.b_min равен нулю, если e_min неотрицателен, и - (b_max + K) в противном случае.Размер наименьшего битового поля, достаточного для хранения всех значений типа перечисления, равен max (M, 1), если b_min равен нулю, и M + 1 в противном случае.Можно определить перечисление, значения которого не определены ни одним из перечислителей.Если список перечислителя пуст, значения перечисления такие, как если бы перечисление имело единственный перечислитель со значением 0
[expr.static.cast] 5.2.8 / 10:
Значение целочисленного типа или типа перечисления может быть явно преобразовано в тип перечисления.Значение не изменяется, если исходное значение находится в диапазоне значений перечисления (7.2).В противном случае результирующее значение не определено (и может не входить в этот диапазон).
преобразование в перечисление без области действия вне двоичного замыкания значений перечисления приводит к неопределенному значению, даже если оно соответствует базовому типу.
enum foo{zero, one};
базовый тип foo
будет неким целочисленным типом, а foo
совместим с макетом этого интегрального типа, и этот целочисленный тип может содержать 2
только файл, но преобразование 2 в foo
приводит к foo
хранение неопределенного значения.