如果在调用时没有采用赋值运算符的返回类型,会发生什么?

Lea*_*ner 0 c++ operator-overloading return-value-optimization

我正在研究运算符重载=并看到下面的例子.

class Ratio {
    public:
        Ratio(int , int  );
        Ratio(const Ratio&);
        Ratio& operator= (const Ratio&);
    private:
        int nNum, nDenum;
};

Ratio::Ratio(int n = 0, int d = 1) {
    nNum = n;
    nDenum = d;
}

Ratio::Ratio(const Ratio &T) {
    nNum = T.nNum;
    nDenum = T.nDenum;
}

Ratio& Ratio::operator= (const Ratio& R) {
    nNum = R.nNum;
    nDenum = R.nDenum;
    return *this;
}

int main() {
    Ratio r1;
    Ratio r2(2,3);
    r1 = r2;//STATEMENT 1
}
Run Code Online (Sandbox Code Playgroud)

这段代码运行良好,但我想知道为什么?由于函数operator=返回对Ratio对象的引用,但在STATEMENT 1中,我们没有在任何Ratio对象中获取返回引用.

son*_*yao 5

什么都没发生.operator=返回引用只是用于将它们链接在一起的用法.如:

r1 = r2 = r3;
Run Code Online (Sandbox Code Playgroud)

赋值是右关联的,所以上面的赋值链解析如下:

r1 = (r2 = r3);
Run Code Online (Sandbox Code Playgroud)

无论如何,这只是一个约定,但后面是所有内置类型以及标准库中的所有类型.