首页 > 解决方案 > 为什么我在重置参考时没有收到错误消息?

问题描述

在下面的代码中

#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. 对于我所读到的内容,您无法重新设置引用以使其引用不同的对象,所以我期待一个错误,这是怎么回事?

标签: c++reference

解决方案


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

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

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指向v1x2.ref指向v2,那么期望是默认情况下x1 = x2导致x1.ref指向v2

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


推荐阅读