为什么编译器在第二种情况下显示“错误”? (我已经给出了完整程序的链接) 为什么我必须使用const关键字?
第一种情况:
friend Complex operator + (const Complex &,const Complex &);
Complex c5 = c1+c2+c3+c4;
第二种情况:
friend Complex operator + ( Complex &, Complex &);
Complex c5 = c1+c2+c3+c4;
1st case Full Program-我得到正确的输出
2nd case Full Program-错误:“ operator +”不匹配
答案 0 :(得分:2)
Complex&
不会绑定到临时文件,Complex const&
会绑定。
每个+
返回一个临时值。
通常,您需要:
friend Complex operator + (Complex,const Complex &);
但是这里有两个const&
就可以了。
答案 1 :(得分:1)
表达式c1+c2+c3+c4
的解析和评估方式就像
Complex c5 = operator+(c1, operator+(c2, operator+(c3, c4)));
operator+(c3, c4)
构建并返回一个临时Complex
对象:一个右值。
C ++禁止将右值绑定到非常量左值引用。
但是operator+(Complex&, Complex&)
采用非常量左值引用。因此出现错误消息。
另一方面,operator+(Complex const&, Complex const&)
引用了const左值。
答案 2 :(得分:1)
临时对象不会绑定到非常量引用。当你写这个
auto c3 = c2 + c1 + c0;
然后将计算第一个c1+c0
,并将结果传递到c2.operator+()
。声明运算符为Complex&
时,您就不能通过临时变量;声明为const Complex&
时,则可以通过。在90%的情况下,当期望使用非常量引用时传递临时消息是逻辑错误,因此是禁止的。