Ответ 1
Ответ на это был приведен в комментариях. Моя попытка объяснить все стандартные за ним приведена ниже.
Для нулевой инициализации объекта или ссылки типа
T
означает:
- если
T
является скалярным типом (3.9), объект инициализируется значением полученный путем преобразования целочисленного литерала0
(ноль) вT
;
(Перечисления являются скалярными типами, §3.9/9) Так как преобразование не считается неявным, мы не смотрим в § 4, но §5.2.9;
Результат выражения
static_cast<T>(v)
является результатом преобразуя выражениеv
в типT
.
§5.2.9/10 затем определяет, как интегральные значения преобразуются в типы перечисления.
Значение интегрального или перечисляемого типа может быть явно преобразовано в тип перечисления. Значение не изменяется, если исходное значение равно в пределах значений перечисления (7.2). В противном случае результат значение не указано (и может быть не в этом диапазоне).
Нужно показать, что ноль находится в диапазоне значений перечисления для всех перечислений.
Следующие пять цитат взяты из §7.2/8:
Для перечисления, основной тип которого фиксирован, значения перечисление - значения базового типа.
Так как все допустимые базовые типы включают нуль в их диапазоне значений *, это автоматически дает желаемый результат. Теперь для перечислений без фиксированных базовых типов
В противном случае для перечисления, где e min является наименьшим перечислитель и e max является наибольшим, значения перечисление - это значения в диапазоне b min до b max, определяемый следующим образом:
т.е. мы должны показать, что b min всегда меньше или равно нулю, а b max всегда больше или равно нулю.
Пусть K равно 1 для двух дополнение и 0 для одного дополнения или представление знаковой величины.
b max - наименьшее значение, большее или равное max (| e min | - K, | e max |) и равна 2M - 1, где M - неотрицательное целое число.
| e max | неотрицательна, а максимум двух чисел не меньше, чем оба числа. Следовательно, max (| e min | - K, | e max |) также неотрицателен, а b max должен быть больше или равное этому числу, поэтому наше первое требование выполнено.
b min равно нулю, если e min неотрицательно и - (b max + K) в противном случае.
b min явно либо ноль, либо отрицательный: b max неотрицателен, как показано выше, и K неотрицательно (0 или 1), следовательно, аддитивная обратная их сумма неположительна. Наше второе требование выполнено. Наконец,
Если список перечислений пуст, значения перечисление, как если бы перечисление имело один перечислитель с значение
0
.
Это приводит к вышесказанному результату: e min= e max= 0.
- Это сводится к утверждению "Все интегральные типы имеют нуль в своем диапазоне значений", что осталось доказать читателю.