Я заметил, что назначение char
к const int&
компилирует, но назначая его int&
выдает ошибку компиляции.
char c;
int& x = c; // this fails to compile
const int& y = c; // this is ok
Я понимаю, что это не очень хорошая практика, но мне любопытно узнать причину, по которой это происходит.
Я искал ответ, ища «назначение ссылки другого типа», «назначение char для ссылки int» и «различие между константной ссылкой и неконстантной ссылкой», и наткнулся на ряд полезных сообщений (Int против Const Int& , Странное поведение при назначении символа переменной int , Конвертировать char в int в C и C ++ , Разница между ссылкой и константной ссылкой в качестве параметра функции?), но они, кажется, не обращаются к моему вопросу.
Приношу свои извинения, если на этот вопрос уже был дан ответ.
int& x = c;
Здесь неявное преобразование из char
в int
выполняется компилятором. В результате временный int
может быть привязан только к const
ссылка. Привязка к const int&
также увеличит время жизни временного результата, чтобы оно соответствовало ссылке, к которой он привязан.
Такое поведение оправдано в стандарте N4527 в 8.5.3 / p5.2 Ссылки [dcl.init.ref]
5 Ссылка на тип «cv1 T1» инициализируется выражением типа
«Cv2 T2» следующим образом:…
5.2 В противном случае ссылка должна быть lvalue ссылкой на
энергонезависимый тип const (т. е. cv1 должен быть const) или ссылка
должна быть ссылка на значение. [ Пример: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
— конец примера]
Тот факт, что линия
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
был изменен.