为什么在具有多个参数的重载 operator+ 中通过 const 引用传递

Why pass by const reference in overload operator+ with multiple parameters

我正在使用多个参数进行 operator+ 重载,如下所示。

#include <iostream>
using namespace std;
class Integer{
    int value;
    public:
        Integer(int i) {value=i;};
        int getValue() { return value;};
        friend Integer operator+ (Integer & a, Integer & b){
            Integer I (a.value+b.value);
            return I;
        };
};

int main() {
    Integer a(1), b(2), c(3);
    Integer d = a+b+c;
    cout<<d.getValue()<<endl;
    return 0;
}

无法编译并且return“不匹配运算符+”。我阅读并理解了 ((a+b)+c) 的多参数算法。为什么它不起作用? 但是,我找到了两种方法让它工作:

friend Integer operator+ (const Integer & a,const Integer & b){
    Integer I (a.value+b.value);
    return I;
};

friend Integer & operator+ (Integer & a,Integer & b){
    Integer I (a.value+b.value);
    return I;
};

但我不知道为什么。谢谢

看看你的operator+签名:

friend Integer operator+ (Integer & a, Integer & b)
//                        ^^^^^^^^^    ^^^^^^^^^

ab 左值引用 .


写的时候

Integer d = a+b+c;

a+b 产生类型 Integerrvalue,它不绑定到 Integer&


带有 const Integer & 的版本作为 const 左值引用可以绑定到 lvaluesrvalues .

执行 a+b+c; 将首先使用 ab 调用 operator +,这将产生一个临时的 Integer 对象,然后调用 operator +使用那个临时对象和 c。无法第二次调用 operator +,因为不能将临时对象作为对非 const 限定对象的引用传递。

声明 operator + 接受非常量引用无论如何都没有意义,因为对象传递没有被修改。