非常量左值引用

Non const lvalue references

本文关键字:引用 常量 非常      更新时间:2023-10-16

为什么你可以这样做

int a;
const double &m = a;

但是当你这样做时

int a;
double &m = a;

您收到错误?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'

编辑:

更具体地说,我试图理解非常量引用无法绑定临时对象的原因。

这是因为临时不能绑定到非常量引用。

double &m = a;

a 属于 int 类型,正在转换为 double 。因此创建了一个临时。用户定义类型也是如此。

Foo &obj = Foo(); // You will see the same error message.

但是在Visual Studio中,由于默认情况下启用了编译器扩展,因此它可以正常工作。但海湾合作委员会会抱怨。

因为对临时进行修改是没有意义的,所以C++不希望您将非常量引用绑定到临时引用。例如:

int a;
double &m = a;  // caution:this does not work.

如果它有效怎么办?
a 的类型为 int,正在转换为双精度。因此创建了一个临时。

您可以修改m,它绑定到临时的,但几乎什么都不会发生。修改后,变量a不会改变(更糟糕的是?您可能认为a已更改,这可能会导致问题(。

示例的简单解释

一旦引用设置为对象/变量,就无法修改它以引用另一个对象

    int a = 1;      //this are variable
    int b = 2;
    
    int &ref1 = a;
    int &ref1 = b; // this is error
    ref1 = b;      // now a = 2

顾名思义,暂时的生命只是短暂的。它通常在它所属的表达式的末尾销毁,即在下一个分号处,或者更罕见的是,在 if 语句等控制表达式的末尾销毁。

有一种方法可以延长临时的寿命:将其绑定到const ref(普通的ref不会完成这项工作(。

因此,不能将临时绑定到非常量引用的正式原因是:

因为引用会立即悬而未决。

现在你可能会问"为什么非常量裁判也不能延长临时的寿命? 做出设计决策可能是因为它太容易出错了。即使通过 const ref 延长生命周期也容易出错:人们可能会返回该引用并使用它来初始化另一个自原始引用的范围离开以来悬而未决的引用。对于非常量引用,人们可能还认为通过引用编写会产生效果,例如,当它通常不会。当然,可以像使用任何局部变量一样使用 const ref:通过它所做的更改只能通过它看到,并且除非复制引用的对象,否则无法在 ref 的范围之外访问它。但是对于这个用例,我们有一个真实且经过测试的零开销解决方案,每个人都会立即理解:局部变量 ;-(。