Константная ссылка на приведенный 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
непосредственно.