从重载+运算符返回到overloaded =运算符时,未调用的复制构造函数

时间:2014-11-16 05:41:11

标签: c++ operator-overloading copy-constructor return-value-optimization copy-elision

请考虑以下代码:

#include <iostream>
using namespace std;
class loc 
{
    int longitude, latitude;
    public:
        loc() {}
        loc(int lg, int lt) 
        {
            longitude = lg;
            latitude = lt;
        }
        loc(const loc& l)
        {
            cout << "a" << endl;
        }
        loc operator = (loc op2)
        {
            longitude = op2.longitude;
            latitude = op2.latitude;
            return *this;
        }
        loc operator+(loc op2);
};
loc loc::operator+(loc op2) {
    loc temp;
    temp.longitude = op2.longitude + longitude;
    temp.latitude = op2.latitude + latitude;
    return temp;
}
int main()
{
    loc ob1(10, 20), ob2( 5, 30);
    ob1 = ob1 + ob2;
    return 0;
}

使用命令g++ file.cpp编译此程序时,输出为:

a
hello

然后使用命令g++ -fno-elide-constructors file.cpp编译该程序,输出为:

a
a
a
hello

我的问题是:

在第一种情况下,为什么两个拷贝构造函数被省略了?

反正哪些拷贝构造器被删除了? =运算符或+运算符

是否有不同的机制

修改

我知道正确的赋值运算符或复制构造函数应该是什么样的。请回答为什么在上述情况下省略了两个复制构造函数而不是更正赋值运算符。

1 个答案:

答案 0 :(得分:1)

一个省略的副本是op +的回报。 RVO允许直接在最终目的地构造结果,完全省略temp。摘录副本来自temp

第二个省略的副本将op +的结果传递给op =,这是一个临时的。相反,它安排op +的结果直接在op2参数中构造。这不是RVO,只是临时的正常情况。