Присваивание 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
.