我在理解此代码段中的行为时遇到了一些麻烦:
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
,那么它可以正常运行。这里发生了什么?
答案 0 :(得分:33)
您只能引用同一类型的对象。
您无法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
答案 1 :(得分:9)
第二个印刷语句也给出2,但我认为它应该给100?
因为此处创建了临时int
。
对于const int &r = i;
,i
(unsigned int
)首先需要转换为int
,表示将创建一个临时int
然后绑定到r
(临时可以绑定到对于const的左值引用),它与原始变量i
无关。
如果我将变量i变成int类型而不是unsigned int,它就像我期望的那样工作。
由于不需要转换和临时转换,i
可以直接绑定到r
。