为什么不能在operator =中使用引用类型?

时间:2018-09-22 01:30:29

标签: c++ operator-overloading

我正在尝试覆盖我的课程的operator+operator=。 这是我的代码:

#include <iostream>
#include <vector>

using namespace std;

class Integer {
public:
    int i;
    Integer operator+ (Integer&);
    Integer& operator= (Integer&);
};

Integer Integer::operator+(Integer& rhs) {
    Integer res;
    res.i = this->i + rhs.i;

    return res;
}

Integer& Integer::operator=(Integer& rhs) {

    this->i = rhs.i;
    return *this;
}

int main()
{
    Integer i1, i2, i3;
    i1.i = 1, i2.i = 2;
    i3 = i1 + i2;
    cout << i3.i;
}

在Visual Studio 2017中,编译器抱怨:

"E0349  no operator "=" matches these operands"

似乎Integer对象与Integer&函数中的operator=不匹配。但是它适用于operator+函数。这很令人困惑。

非常感谢。

2 个答案:

答案 0 :(得分:3)

i3 = i1 + i2;

返回类型为Integer的临时变量。

现在,您的operator=需要一个Integer&。这是对Integer的引用。问题在于临时对象无法绑定到非常量引用。

只需确保您更改为const Integer&。无论如何,这是所有运算符重载的默认值。

答案 1 :(得分:2)

我将在赋值语句中对此进行细分。

i3 = i1 + i2;

发生的第一件事是对加法表达式进行求值。 这是这段代码片段:

i1 + i2

您设计了运算符重载来处理此表达式。 您的自定义加法运算符重载将返回一个新的Integer实例。 但是,当您尝试将此新实例分配给参数时,就会出现问题 在您的作业超载中。这是该代码段。

Integer& Integer::operator=(Integer& rhs);

在函数声明中使用引用的参数时,编译器会检查以确保该值不是临时值,以便在调用函数后该值将存在。编译器已确定(正确)传递给此赋值语句的参数是一个临时值。这就是为什么当您尝试这样做时会吐出错误的原因。

我认为使您的代码有意义的最合乎逻辑的原因是实现以下内容:

Integer& Integer::operator=(const Integer& rhs) {
    this->i = rhs.i;
    return *this;
}

通过添加const-specifier,您可以告诉编译器在调用函数后您不依赖rhs来持久存在。在这种情况下,传递给该参数的值可能是一个临时值。