Присваивание char значению int и const int в С++

Я заметил, что назначение компиляции char в const int&, но присвоение ему int& дает ошибку компиляции.

char c;
int& x = c;    // this fails to compile
const int& y = c;    // this is ok

Я понимаю, что это не очень хорошая практика, но мне любопытно узнать причину, почему это происходит.

Я искал ответ, ища "назначение на ссылку другого типа", "назначение char для ссылки на int" и "разность между константной ссылкой и неконстантной ссылкой" и столкнулся с числом полезных сообщений (int vs const int &, Странное поведение при присваивании переменной char переменной int, Преобразовать char в int в C и С++, Разница между ссылкой и ссылкой на константу как параметр функции?), но они, похоже, не рассматривают мой вопрос.

Мои извинения, если это уже было сказано ранее.

Ответ 1

int& x = c;

Здесь неявное преобразование из char в int выполняется компилятором. Полученный временный int может быть связан только с ссылкой const. Связывание с const int& также продлит время жизни временного результата в соответствии с привязкой ссылки, к которой он привязан.

Ответ 2

Это поведение оправдано в стандартном N4527 в 8.5.3/p5.2 Ссылки [dcl.init.ref]

5 Ссылка на тип "cv1 T1" инициализируется выражением типа "cv2 T2" следующим образом:

...

5.2 В противном случае ссылка должна быть ссылкой lvalue на нелетучий тип const (т.е. cv1 должен быть const), или ссылочный должна быть ссылкой rvalue. [Пример:

double& rd2 = 2.0; // error: not an lvalue and reference not const
int i = 2;
double& rd3 = i; // error: type mismatch and reference not const

- конец примера]

Ответ 3

Тот факт, что линия

const int& y = c; 

создает временную привязку y к временному может быть проверена следующим образом:

#include <iostream>

int main()
{
   char c = 10;
   const int& y = c;

   std::cout << (int)c << std::endl;
   std::cout << y << std::endl;

   c = 20;

   std::cout << (int)c << std::endl;
   std::cout << y << std::endl;

   return 0;
}

Вывод:

10
10
20
10

Значение y не изменилось при изменении значения c.