1

考虑以下代码:

#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

我的问题是:

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

还是省略了哪些复制构造函数?= 运算符或 + 运算符是否有不同的机制

编辑

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

4

1 回答 1

1

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

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

于 2014-11-16T08:59:00.483 回答