назначение 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 и C++ , Разница между ссылкой и константной ссылкой как параметром функции?), но, похоже, они не касаются моего вопроса.

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


person Masked Man    schedule 08.12.2012    source источник
comment
@downvoter не могли бы вы объяснить причину? Я хочу узнать, как я могу улучшить качество своих вопросов здесь, так как я планирую регулярно посещать этот сайт. :)   -  person Masked Man    schedule 08.12.2012


Ответы (3)


int& x = c;

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

person Praetorian    schedule 08.12.2012
comment
Спасибо за хорошее объяснение. - person Masked Man; 10.12.2012

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

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

...

5.2 В противном случае ссылка должна быть ссылкой lvalue на неизменяемый константный тип (т. е. 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

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

person 101010    schedule 04.12.2015

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

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.

person R Sahu    schedule 04.12.2015