常量变量 vs 常量引用

4

在一些 C++ 源代码中,我发现一个表达式的结果可以保存为常量引用。像这样:

 const int &x = y + 1;

这是什么意思?是否有相关文档可以查看?我找不到。


对我来说,它似乎相当于:

 const int x = y + 1;

程序的结果保持不变,是否真正等价?

如果是,为什么语言允许第一种方式进行编写?这看起来很混乱。

如果不是,有什么区别?


第一个有点棘手。据我所知,它所做的是创建一个常量引用,指向通过计算 y + 1 而获得的临时变量。 - user529758
1
@H2CO3 不完全正确,据我所知,表达式 y+1 会产生一个值但不是临时对象。因此,引用绑定本身创建了临时对象。 - dyp
1个回答

5
差别在于是否复制/移动了结果。在第一种情况下:
const int& x = y + 1;

y+1 的值实际上被保存为一个临时值。然后我们将一个引用 x 初始化为这个临时结果。在另一种情况下:

const int x = y + 1;

我们计算 y + 1 并用该值初始化一个常量变量x
在整数运算中,通常不会出现明显的区别。但如果y+1是一个庞大的数据结构,例如一个占用1MB内存的类,这可能会导致重大差异。

2
此外,在这行代码之后,基本上不可能注意到任何行为上的差异。初始化后,x 的行为方式完全相同。对于较大的数据结构,它可能会在 const X x = y + 1 中调用复制构造函数(或者可能会省略它)。另一方面,const X &x = y + 1 保证不会调用复制构造函数。 - Aaron McDaid
这并没有回答为什么语言允许你这样做,我认为这与允许你使用临时变量调用需要const引用参数的函数有关。 - David Brown
谢谢!如果x指的是临时结果,使用它是否安全? - klm123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接