从 unsigned int 转换为 int 的常量引用

Const reference to a casted int from 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,它将按我预期的那样工作。这里发生了什么?

Live example

The second print statement also gives 2, but I think it should give 100?

因为这里创建了一个临时的int

对于const int &r = i;iunsigned int)需要先转换为int,即创建一个临时的int,然后绑定到 r(临时变量可以绑定到对 const 的左值引用),它与原始变量 i 不再有任何关系。

If I make variable i into type int instead of unsigned int, it works as I expect.

因为不需要转换和临时,i可以直接绑定到r

您只能引用相同类型的对象。

您不能 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
 = 2
(gdb) p &i
 = (unsigned int *) 0x7fffffffea0c
(gdb) p &r
 = (const int *) 0x7fffffffe9fc
(gdb) q