const对unsigned int的casted int的引用

时间:2016-07-31 14:08:15

标签: c++ reference const const-reference

我在理解此代码段中的行为时遇到了一些麻烦:

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,那么它可以正常运行。这里发生了什么?

Live example

2 个答案:

答案 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;iunsigned int)首先需要转换为int,表示将创建一个临时int然后绑定到r(临时可以绑定到对于const的左值引用),它与原始变量i无关。

  

如果我将变量i变成int类型而不是unsigned int,它就像我期望的那样工作。

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