我在理解此代码段中的行为时遇到了一些麻烦:
unsigned int i = 2;
const int &r = i;
std::cout << r << "\n";
i = 100;
std::cout << r << "\n";
第一个打印语句按我的预期给出了 2,但是当我更改引用变量的值时,它不会反映在引用中。第二个打印语句也给出 2,但我认为它应该给出 100?
如果我将变量i转换为 typeint而不是unsigned int,它会按我的预期工作。这里发生了什么?
我在理解此代码段中的行为时遇到了一些麻烦:
unsigned int i = 2;
const int &r = i;
std::cout << r << "\n";
i = 100;
std::cout << r << "\n";
第一个打印语句按我的预期给出了 2,但是当我更改引用变量的值时,它不会反映在引用中。第二个打印语句也给出 2,但我认为它应该给出 100?
如果我将变量i转换为 typeint而不是unsigned int,它会按我的预期工作。这里发生了什么?
您只能引用相同类型的对象。
您不能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(临时变量可以绑定到对 const 的左值引用), 它与原始变量无关i。
如果我将变量 i 设为 int 类型而不是 unsigned int,它会按我的预期工作。
因为不需要转换和临时,i可以直接绑定r。