gpt4 book ai didi

c++ - 从重载 + 运算符返回到重载 = 运算符时不调用复制构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:25:03 25 4
gpt4 key购买 nike

考虑以下代码:

#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

我的问题是:

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

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

编辑

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

最佳答案

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

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

关于c++ - 从重载 + 运算符返回到重载 = 运算符时不调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com