赋值运算符不工作

时间:2015-02-20 18:53:45

标签: c++ operators

这段代码是什么:

MyClass t;
t = MyClass(100); 

我在我的代码中使用了类似的东西,我得到了编译错误error: no match for ‘operator=’。我在Java中解释它,但显然它有所不同。

我的赋值运算符声明如下:

MyClass& operator=(Myclass& other)

当我将代码更改为此时,它可以正常工作:

MyClass temp(100);
t = temp;

我不能这样做:

Myclass t(100)

4 个答案:

答案 0 :(得分:4)

你需要将rhs声明为const referece

MyClass& operator=(const Myclass& other);

当你有

t = MyClass(100);

右侧是临时的,非const左值引用不能绑定到临时对象。

你后来的尝试

MyClass t2(100);
t = t2;

创建一个命名对象t2,因为这是一个实际的非const左值,你的赋值运算符的参数能够绑定到它。

如果您尝试

,可以直接看到
MyClass& r1 = MyClass(100); // invalid, non-const ref to temporary
const MyClass& r2 = MyClass(100); // valid, const ref to temporary
MyClass mc(100);
MyClass& r3 = mc; // valid, non-const ref can bind to a named object
                  // as long as the object itself isn't declared const
const MyClass& r4 = mc; // valid, you can bind a non-const ref as well

答案 1 :(得分:1)

您的赋值运算符应将const引用作为参数。因为临时MyClass(100)不能绑定到非const引用,所以无法调用当前的实现。

答案 2 :(得分:1)

那是因为在作业中

t = MyClass(100);

分配右侧的对象是临时对象,您无法引用临时对象。但是,您可以使用常量引用,因此如果您将赋值运算符定义为

MyClass& operator=(const Myclass& other)

它会起作用。

如果您使用新的C ++ 11 rvalue-reference:

,它也会起作用
MyClass& operator=(Myclass&& other)

答案 3 :(得分:0)

忘了const C ++编译器应绑定右侧的const对象

MyClass的&安培; operator =(const Myclass& other);