1+5
- это int
, поэтому нет проблем с его использованием для инициализации записи vector<int>
.
'r' + 's'
- это int
(236), которое выходит за пределы char
в вашей системе. Итак, - это проблема при попытке использовать его для инициализации записи vector<char>
. Это именно тот случай, для которого было разработано правило об инициализации списка, запрещающее сужающие преобразования.
Вы получите ту же ошибку для vector<char> x = { 'a', 'b', 123456 };
Standalone char
либо имеет те же свойства, что и signed char
, либо unsigned char
, который определяется реализацией, а некоторые у компиляторов есть переключатель для выбора (например, -funsigned-char
на G CC). Для ясности, в любом случае это по-прежнему отдельный тип.
По вашим словам, char
действительно был подписан в обоих случаях, как объяснил Натан Оливер в комментариях . Проблема в том, что у вас неправильное представление о том, что автономный char
не был подписан в вашем случае. Просто потому, что char ch = 'r' + 'z';
скомпилирован, не означает, что он беззнаковый. Вы, наверное, подумали, что он беззнаковый, потому что 'r' + 'z' == 236
не подходит к signed char
. Нет, он подходит к signed char
по следующей причине:
char ch = 'r' + 'z';
- это преобразование вне допустимого диапазона . Начиная с C ++ 20 результатом будет -20
(при условии, что обычный char имеет 8-битную подпись, как указано в вашем предыдущем сообщении об ошибке, и система использует кодировку ASCII), до этого результат был определен реализацией.
Итак, не предполагайте ничего. Если вы не уверены, является ли char в вашей системе подписанным или неподписанным, просто отметьте CHAR_MIN
.