gpt4 book ai didi

c++ - 当我取消注释移动构造函数 A(A&&) 时,下面的代码片段会发生什么情况?

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:15 27 4
gpt4 key购买 nike

下面的片段似乎没问题,我相信声明 A a(std::move(b).toA());main()为类 A 调用隐式声明的移动构造函数, 作为 A没有用户定义的复制构造函数,没有用户定义的复制赋值运算符,没有用户定义的移动赋值运算符,也没有用户定义的析构函数(参见§12.8/9 N4140 ).但是,当我取消注释移动构造函数时 A(A&&) { std::cout << "move A" << '\n'; }下面,我收到 Illegal instruction信息。参见 live example .这是为什么?

#include <iostream>
#include <memory>
class A {
public:
// A(const A&) { std::cout << "copy A" << '\n'; }
// A(A&&) { std::cout << "move A" << '\n'; }
A(std::unique_ptr<int>&& u_ptr) : u_ptr(std::move(u_ptr)) {}
const int& getInt() { return *u_ptr; }

private:
std::unique_ptr<int> u_ptr;
};

class B {
public:
B(int u_ptr) : u_ptr(new int(u_ptr)) {}
A toA() && { return A(std::move(u_ptr)); }

private:
std::unique_ptr<int> u_ptr;
};

int main() {
B b(-1);
A a(std::move(b).toA());
std::cout << a.getInt() << '\n';
return 0;
}

最佳答案

您的移动构造函数定义没有做隐式定义的定义所做的事情——它没有移动构造 u_ptr 数据成员。所以a.u_ptr是默认构造的,内部int*初始化为nullptr。对 a.getInt() 的调用然后尝试取消引用此 nullptr 导致崩溃。

如下定义你的移动构造函数,你的代码将正确运行

A(A&& other) : u_ptr(std::move(other.u_ptr)) { std::cout << "move A" << '\n'; }

关于c++ - 当我取消注释移动构造函数 A(A&&) 时,下面的代码片段会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31927472/

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