gpt4 book ai didi

c++ - 我更改了我的类的默认构造函数,但似乎编译器仍然调用默认构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:08 26 4
gpt4 key购买 nike

我创建了一个A类,并覆盖了operator+和constructor A(A&&),我想知道我是否调用了

A a, b;
A c = a + b;

我的构造函数 A(A &&) 被调用了吗?

我尝试了一些代码,但得到的结果非常困惑

//try2.cpp

#include <iostream>
#include <string>
using namespace std;
class A {
public:
string s;
A(A &&a) { s=std::move(a.s); cout<<"A(A &&a) called"<<endl;}
A() {}
};

A operator+(const A &a, const A &b) {
A c;
c.s=a.s+b.s;
return c;
}

int main() {
A a,b;
a.s = "123";
b.s = "456";
A c = a+b;
cout<<c.s<<endl;
return 0;
}

我使用了 gcc 7.0: g++ -std=c++1y try2.cpp

输出是 123456,因此 A(A &&a) 没有被调用

但后来我改变了

A(A &&a) = 删除;

然后编译器抛出错误:

try2.cpp: In function ‘A operator+(const A&, const A&)’:
try2.cpp:14:10: error: use of deleted function ‘A::A(A&&)’
return c;
^
try2.cpp:7:3: note: declared here
A(A &&a) = delete;
^
try2.cpp: In function ‘int main()’:
try2.cpp:21:11: error: use of deleted function ‘A::A(A&&)’
A c = a+b;
^
try2.cpp:7:3: note: declared here
A(A &&a) = delete;

构造函数 A(A &&a) 是必需的。但是为什么之前的代码没有调用呢?

最佳答案

Named Return Value Optimization .

编译器意识到,与其在 operator+ 范围内创建一个 A 并将其移出 operator+ 并移入 main,它可以(基本上)只在 main 中构造它,并让 operator+ 处理 main 中的值。

为了使您的程序有效,您需要一些允许复制值的构造函数——但编译器不需要使用它,如果它意识到它可以优化一些复制/移动。

关于c++ - 我更改了我的类的默认构造函数,但似乎编译器仍然调用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55994701/

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