2017-06-01 74 views
1

我重载了某个类c1的赋值运算符,并且我还重载了添加运算符,用于添加类c1和c2。当我使用它们如下:过载赋值运算符,rhs是一个函数调用

// signatures of the overloaded operators: 
c2 c1::operator+(c2 & obj_c2); 
c1& c1::operator=(c2& obj_c2); 


// use them like this: 
c1 obj1; 
c2 ojb2; 
obj1=obj1+ojb2; 

这编译失败。但是,如果使用一个临时对象,它的工作原理:

c1 obj1; 
c2 ojb2, temp; 
temp=obj1+ojb2; 
obj1=temp; 

我使用的编译器是G ++,怎么可能有问题没有一个临时对象?

+0

要么使加法运算符返回一个引用,要么添加另一个赋值的赋值运算符。 – Barmar

+3

我建议你检查[规范运算符超载实现](http://en.cppreference.com/w/cpp/language/operators#Canonical_implementations)。注意赋值运算符的参数是如何引用*'const' *? –

回答

1

只要仔细看一下您的实现运营商=

c1& c1::operator=(c2& obj_c2); 

这里运营商=通过参考接受它的参数。但引用无法绑定到临时对象。在第二个例子中,引用绑定到temp,这不是一个临时的,所以它的工作原理。

为了解决这个问题,改变你的运营商=到:

c1& c1::operator=(const c2& obj_c2); 

这应该工作。

+0

谢谢,它的工作原理!这意味着临时对象可以被const引用,尽管它不能被引用。 –