非常量左值引用
Non const lvalue references
为什么你可以这样做
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 的范围之外访问它。但是对于这个用例,我们有一个真实且经过测试的零开销解决方案,每个人都会立即理解:局部变量 ;-(。
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 将常量指针引用绑定到非常量指针
- 通过常量引用传递参数的矩阵模板类
- 按值捕获引用时出现非常量
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么按值传递QStringView比引用常量更快?
- 通过引用常量函数调用另一个类的非常量函数
- 构造常量对象与引用常量对象
- 引用“常量value_type”时出错
- 为什么可以在 for 语句中重新分配引用常量
- 程序反馈:命名循环索引和引用常量数据
- 堆还是栈?在c++中函数调用中引用常量字符串时
- 为什么常量结构数组在按名称引用常量结构时不放在 .rodata 中?
- 为什么编译器允许在函数中发送对迭代器的引用,该函数引用常量迭代器