Почему const int подходит для инициализации символьной скобки?

Я думал, что инициализация скобки не допускает сужения. Но почему int const разрешено для инициализации char фигурной скобки?

int value1 = 12;
char c1{value1};  // error! no narrowing

const int value2 = 12;
char c2{value2};   // why is this fine?

См. на Godbolt.


person BK C.    schedule 09.09.2019    source источник
comment
Какой компилятор и какие параметры вы используете? От этого тоже зависит!   -  person csabinho    schedule 24.09.2019


Ответы (1)


const int value2 = 12;

value2 — константа времени компиляции. Компилятор может легко (и должен) доказать, что значение равно 12, которое находится в пределах диапазона значений, представляемых char.

int value1 = 12;

value1 не является константой времени компиляции. Значение переменной может измениться во время выполнения.

Точная формулировка стандартного правила (цитируется последний проект, курсив добавлен):

[dcl.init.list]/7

Сужающее преобразование – это неявное преобразование.

  • от целочисленного типа или типа перечисления с незаданной областью к целочисленному типу, который не может представлять все значения исходного типа, за исключением случаев, когда источником является постоянное выражение, значение которого после целочисленных преобразований будет соответствовать целевому типу.
person eerorika    schedule 09.09.2019