Константная ссылка на приведенный int из unsigned int

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

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

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

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

Живой пример

2 ответа

Решение

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

Вы не можете иметь 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, но я думаю, что это должно дать 100?

Потому что временный int создан здесь.

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

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

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

Другие вопросы по тегам