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
, она работает так, как я ожидаю. Что здесь происходит?
Живой пример
Ответы
Ответ 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
.