C++ 重载赋值运算符,rhs是一个函数调用

C++ 重载赋值运算符,rhs是一个函数调用,c++,class,oop,operators,overloading,C++,Class,Oop,Operators,Overloading,对于某些类c1,我重载赋值运算符,对于类c1和c2的加法,我也重载加法运算符。当我按如下方式使用它们时: // 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,我重载赋值运算符,对于类c1和c2的加法,我也重载加法运算符。当我按如下方式使用它们时:

// 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++,如果没有临时对象,这怎么会是一个问题呢?

请仔细看看运算符=:

这里operator=通过引用接受其参数。但是引用不能绑定到临时对象。在第二个示例中,引用绑定到temp,temp不是临时的,因此它可以工作

要解决此问题,请将运算符=更改为:


这应该有效。

要么让加法运算符返回引用,要么添加另一个赋值运算符。我建议您检查。请注意赋值运算符的参数是如何引用
常量的?谢谢,它可以工作!这意味着临时对象可以被常量引用,尽管它不能被引用。
c1& c1::operator=(c2& obj_c2);
c1& c1::operator=(const c2& obj_c2);