Ответ 1
const int value2 = 12;
value2
является константой времени компиляции. Компилятор может легко (и должен) доказать, что значение равно 12, что находится в диапазоне значений, представляемых char
.
int value1 = 12;
value1
не является константой времени компиляции. Значение переменной может измениться во время выполнения.
Точная формулировка стандартного правила (цитата из последней версии, выделение добавлено):
Сужающееся преобразование - это неявное преобразование
- от целочисленного типа или перечислимого типа с незаданной областью до целочисленного типа, который не может представлять все значения исходного типа, кроме случаев, когда источником является константное выражение, значение которого после целочисленных повышений будет соответствовать целевому типу.