c++ - 为什么我在重置参考时没有收到错误消息?
问题描述
在下面的代码中
#include<iostream>
using namespace std;
int main(){
int x=4;
int y=5;
cout << x <<endl;
int& foo = x;
// foo is now a reference to x so this sets x to 56
foo = 56; //reseting the reference foo
cout << x <<endl;
cout << foo <<endl;
foo= y; //this is supposed to be forbidden
cout << foo <<endl; // but I am getting foo=5
return 1;
}
这编译得很好,我进入foo=5
了最后一个cout
. 对于我所读到的内容,您无法重新设置引用以使其引用不同的对象,所以我期待一个错误,这是怎么回事?
解决方案
一旦创建了引用,任何使用引用变量的尝试都等同于使用分配给它的对象。
因此,当我们查看以下代码行时:
foo= y; //this is suppose to be forbidden
我们看到它并没有尝试重新分配引用,而是将 的值分配给 引用y
的对象foo
。
那么,重置引用(会产生错误)的示例是什么?
虽然我们不能编写重新分配引用的代码,但编译器最终可能会不得不发出与处理嵌入在其他数据结构中的引用时相同的代码。编译器这样做仍然是非法的。
例如,以下代码将无法编译,因为X
无法创建编译器生成的赋值运算符 for ,因为它涉及重新分配ref
。
struct X {
int& ref;
};
void foo() {
int v1 = 1;
int v2 = 2;
X x1{v1};
X x2{v2};
x1 = x2; // Boom!
}
编辑:在这里回答后续问题,因为它非常相关。
现在您可能想知道:“嘿!如果引用充当另一个变量的代理,为什么编译器不能只使用该逻辑为 生成有效的赋值运算符struct X
?”
嗯,不是真的。这里的基本期望是,一旦我这样做var_a = var_b
,那么默认情况下,var_a
现在实际上与var_b
.
所以如果x1.ref
指向v1
和x2.ref
指向v2
,那么期望是默认情况下会x1 = x2
导致x1.ref
指向v2
。
从长远来看,做任何其他事情只会导致混乱和惊喜。
推荐阅读
- r - 如何找到第三名的学生?
- javascript - 如何从新的 MetaMask 以太坊 API 中获取账户列表?
- oauth-2.0 - OTK(开放令牌)与 JWT
- python - 为什么数据框仅将迭代的最后一个值导出到 csv?(Python)
- python - 使用 Selenium 进行动态网页抓取
- node.js - 拒绝访问 nsis 电子生成器
- c# - 不能在列表中添加元素(在 C# 中)
- jpa - JPA 休眠多对一。删除一个
- flutter - 为什么我会收到此错误错误状态:使用 Firestore 时 DocumentSnapshotPlatform 中不存在字段?
- .htaccess - 将页面的每个路径重定向到一个特定路径