C++ 为什么重置引用时我没有收到错误?

C++ 为什么重置引用时我没有收到错误?,c++,reference,C++,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

在下面的代码中

#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。就我所读到的内容而言,您无法重置引用以使其引用其他对象,因此我预期会出现错误,这是怎么回事?

一旦创建了引用,使用引用变量的任何尝试都等同于使用分配给它的对象

因此,当我们看到以下代码行时:

foo= y; //this is suppose to be forbidden 
我们看到,它没有尝试重新分配引用,而是将y的值分配给foo引用的对象

那么,重置会产生错误的引用的示例是什么

虽然我们无法编写重新分配引用的代码,但编译器最终可能会遇到这样的情况:它必须发出与处理嵌入到其他数据结构中的引用时相同的代码。编译器这样做仍然是非法的

例如,以下内容将无法编译,因为编译器为X生成的赋值运算符无法创建,因为它将涉及重新分配ref

编辑:将后续问题移到这里,因为它非常相关

现在你可能会想:嘿!如果引用充当另一个变量的代理,为什么编译器不能使用该逻辑为struct X生成有效的赋值运算符

嗯,不是真的。这里潜在的期望是,一旦我做了var_a=var_b,那么默认情况下,var_a现在实际上与var_b相同

因此,如果x1.ref指向v1,x2.ref指向v2,那么默认情况下,x1=x2将导致x1.ref指向v2


从长远来看,做任何其他事情都只会导致混乱和意外。

一旦创建了引用,使用引用变量的任何尝试都等同于使用分配给它的对象

因此,当我们看到以下代码行时:

foo= y; //this is suppose to be forbidden 
我们看到,它没有尝试重新分配引用,而是将y的值分配给foo引用的对象

那么,重置会产生错误的引用的示例是什么

虽然我们无法编写重新分配引用的代码,但编译器最终可能会遇到这样的情况:它必须发出与处理嵌入到其他数据结构中的引用时相同的代码。编译器这样做仍然是非法的

例如,以下内容将无法编译,因为编译器为X生成的赋值运算符无法创建,因为它将涉及重新分配ref

编辑:将后续问题移到这里,因为它非常相关

现在你可能会想:嘿!如果引用充当另一个变量的代理,为什么编译器不能使用该逻辑为struct X生成有效的赋值运算符

嗯,不是真的。这里潜在的期望是,一旦我做了var_a=var_b,那么默认情况下,var_a现在实际上与var_b相同

因此,如果x1.ref指向v1,x2.ref指向v2,那么默认情况下,x1=x2将导致x1.ref指向v2


从长远来看,做任何其他事情都只会导致混乱和意外。

它不是重新分配引用,而是将y的值分配给x。@Frank我认为重置引用意味着更改其值,因为我已经了解到,您不能在声明时只初始化一次引用。,那么,重置会产生错误的引用的示例是什么呢?没有示例,因为您不能这样做。例如,如果您有一个具有成员引用的类,您将得到一个错误,即无法拥有默认运算符=,因为无法更改引用。引用不是对象。他们是。。。好对其他对象的引用。参考文献甚至不存在,就C++抽象机器而言,尽管这是过于简单化。例如,如果你这样做,你没有得到Foo的地址,但是对象Foo是指。查找*重新引用C++,而不是拼写。它不重新分配引用,它将y的值赋值给x。@弗兰克,我认为重新引用一个引用意味着改变它的值,因为我已经读过了,你不能只初始化一次引用,在声明时,重置一个会产生错误的引用的例子会是什么呢?没有例子,因为您不能这样做。例如,如果您有一个具有成员引用的类,您将得到一个错误,即无法拥有默认运算符=,因为无法更改引用。引用不是对象。他们是。。。好对其他对象的引用。参考文献甚至不存在,就C++抽象机器而言,尽管这是过于简单化。例如,如果您使用&foo,那么您将不会得到foo的地址,而是得到foo引用的对象的地址
“查找”*重新定位引用C++,而不是拼写。我不知道重新指派REF意味着什么,所以在最后一行中,我们将X2的值赋值给X1,它与引用REF有什么关系,为什么它是一个错误?@胡安,X有一个引用成员。因此,将一个X分配给另一个X将涉及重置引用,因为我们当然不希望该操作将v2分配给v1。在您的示例中,是否将v2分配给v1,相当于在我的示例中执行foo=y,即将v2的值复制到v1?@juancarlosvegaoliver假设您的意思是将x2分配给x1,这是一个非常好的问题。这样做的目的是,您描述的行为会导致太多的意外,如果这是您想要的,您可以始终显式地实现X::operator=使其以这种方式运行,因此编译器最好强制您在这些场景中显式。@juancarlosvegaoliver这样做有帮助:引用不是变量。它是现有变量的别名(另一个名称)。它不引用或指向变量。就是那个变量。我不确定重新分配ref意味着什么,所以在最后一行中,我们将x2的值分配给x1,它与ref的引用有什么关系,为什么它是一个错误?@juan,X有一个reference成员。因此,将一个X分配给另一个X将涉及重置引用,因为我们当然不希望该操作将v2分配给v1。在您的示例中,是否将v2分配给v1,相当于在我的示例中执行foo=y,即将v2的值复制到v1?@juancarlosvegaoliver假设您的意思是将x2分配给x1,这是一个非常好的问题。这样做的目的是,您描述的行为会导致太多的意外,如果这是您想要的,您可以始终显式地实现X::operator=使其以这种方式运行,因此编译器最好强制您在这些场景中显式。@juancarlosvegaoliver这样做有帮助:引用不是变量。它是现有变量的别名(另一个名称)。它不引用或指向变量。就是这个变量。