В общем случае присвоения значения int
объекту char
компилятор не знает, находится ли int
вне диапазона char
.
Посмотрите на фактическое предупреждение более внимательно:
warning: overflow in implicit constant conversion
Именно в этом конкретном случае, когда константа преобразуется в char
, компилятор может предупредить вас. Аналогично, если вы изменили объявление i
на const
:
const int i = 256;
вы также получите предупреждение, потому что значение, присваиваемое c2
, является константным выражением.
Обратите внимание, что предупреждение несколько вводит в заблуждение, поскольку преобразование технически не "переполнено". Арифметическое переполнение приводит к неопределенному поведению в C ++. Сужающее преобразование (например, int
в char
, если int
имеет больший диапазон, чем char
), дает некоторое преобразование, определяемое реализацией.