为什么重置引用时没有收到错误?
Why am I not getting an error when reseting a reference?
在下面的代码中
#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;
}
这编译得很好,我在最后cout
得到了foo=5
.对于我读到的内容,您无法重新放置引用以使其引用不同的对象,所以我期待一个错误,这里发生了什么?
创建引用后,任何使用该引用变量的尝试都等效于使用分配给它的对象。
因此,当我们查看以下代码行时:
foo= y; //this is suppose to be forbidden
我们看到它不会尝试重新分配引用,而是将y
的值分配给foo
引用的对象。
那么,重置引用(会产生错误(的示例是什么?
虽然我们不能编写重新分配引用的代码,但编译器最终可能会遇到这样的情况:它必须发出与处理嵌入在其他数据结构中的引用时的代码等效的代码。编译器这样做仍然是非法的。
例如,以下内容将无法编译,因为无法创建编译器生成的X
赋值运算符,因为它将涉及重新赋值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
。
从长远来看,做任何其他事情只会导致混乱和意外。
相关文章:
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- C++引用错误
- 已定义函数时出现 G++ "未定义的引用"错误
- 错误:使用通用引用的声明冲突
- 链接 cmake 时出现未定义的引用错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 隐式重新解释引用时强制转换,没有警告/错误
- 只有级联分类器会发出未定义的引用错误
- 错误:未定义对cv::cudacodec::createVideoReader的引用
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 对于我的 ComplexNumber 中的某些方法,我得到了一个奇怪的未定义错误引用.cpp,不过我对模板很陌生
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- Qt并发错误:引用非静态成员