具有'const int&'数据成员的类在重载operator =(编译器为g ++)时会导致以下编译错误:
分配只读位置。
当数据成员更改为'const int *'时,就可以了。
为什么?
#include <iostream>
using namespace std;
class B {
private:
const int& ir;
//const int* ir;
public:
B(const int& i) : ir(i) {}
//B(const int& i) : ir(&i) {}
B& operator=(B& b) { ir = b.ir; return *this; }
};
g ++错误消息:
opertostack.cpp:9:31: error: assignment of read-only location ‘((B*)this)-> B::ir’
B& operator=(B& b) { ir = b.ir; return *this; }
^~
答案 0 :(得分:0)
您无法重新绑定参考。创建它们后,他们需要在整个生命周期中都引用相同的对象。
但是,您的代码存在更大的问题。让我们删除operator=()
使其编译。然后,我们实例化一个B
:
B b(42);
b.ir
绑定到传递给构造函数的临时int
上。构造函数返回后,该临时变量不再存在。 b.ir
现在是一个悬空引用。它指的是一个不再存在的对象。
指针也无济于事。如果我们将B::ir
更改为const int*
并切换注释掉的代码,则如上所述实例化B
的结果现在是一个悬空指针。它指向一个不再存在的临时对象。
因此,在两种情况下,使用B::ir
时都会出现不确定的行为。
您想要的只是普通的int
成员。在这种情况下,构造函数参数也不必是引用。 int
与引用一样容易复制,因此使用引用参数不会获得任何好处。最后,赋值运算符应采用const
引用,以便您也可以从const B
个对象进行赋值:
class B {
private:
int ir;
public:
B(const int& i) : ir(i) {}
B& operator=(const B& b) { ir = b.ir; return *this; }
};