присвоение 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 против Const Int& , Странное поведение при назначении символа переменной int , Конвертировать char в int в C и C ++ , Разница между ссылкой и константной ссылкой в ​​качестве параметра функции?), но они, кажется, не обращаются к моему вопросу.

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

10

Решение

int& x = c;

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

8

Другие решения

Такое поведение оправдано в стандарте 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

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

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 был изменен.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector