Подтвердить что ты не робот

Const ссылается на casted int из unsigned int

У меня возникли проблемы с пониманием поведения в этом фрагменте:

unsigned int i = 2;
const int &r = i;
std::cout << r << "\n";
i = 100;
std::cout << r << "\n";

Первый оператор печати дает 2, как я ожидаю, но когда я изменяю значение ссылочной переменной, оно не отражается в ссылке. Второй оператор печати также дает 2, но я думаю, что он должен дать 100?

Если я делаю переменную i в тип int вместо unsigned int, она работает так, как я ожидаю. Что здесь происходит?

Живой пример

4b9b3361

Ответ 1

У вас может быть только ссылка на объект того же типа.

У вас нет ссылки int на unsigned int.

Что здесь происходит, по существу:

const int &r = (int)i;

Создается новый int временной, новый временный объект и ссылка const привязана к нему.

Используя ваш отладчик, вы должны учесть, что ссылка ссылается на совершенно другой объект:

(gdb) n
6   const int &r = i;
(gdb) 
7   std::cout << r << "\n";
(gdb) p i
$1 = 2
(gdb) p &i
$2 = (unsigned int *) 0x7fffffffea0c
(gdb) p &r
$3 = (const int *) 0x7fffffffe9fc
(gdb) q

Ответ 2

Второй оператор печати также дает 2, но я думаю, что он должен дать 100?

Так как здесь создается временная int.

Для const int &r = i;, i (unsigned int) сначала необходимо преобразовать в int, значит, будет создан временный int, а затем привязан к r (временный может быть привязан к lvalue для const), он больше не имеет отношения к исходной переменной i.

Если я делаю переменную я в тип int вместо unsigned int, она работает так, как я ожидаю.

Поскольку преобразование и временное не требуется, i может быть привязан непосредственно к r.