gpt4 book ai didi

c++ - 具有 unique_ptr 成员和自定义析构函数的对象 vector

转载 作者:行者123 更新时间:2023-12-02 09:47:51 27 4
gpt4 key购买 nike

假设以下代码将 A 类型的对象移动到 av( vector )中:

#include <memory>
#include <vector>

struct A
{
~A() {};

std::unique_ptr<int> an_int;
};


int main(int argc, char* argv[])
{
std::vector<A> av;
av.push_back(A());

return 0;
}

这将无法按原样编译。但是,如果我不实现析构函数 ~A() {},它将正常工作。编译器提示缺少(已删除)copy constructor,但我看不出它适用于此处(因为我只进行移动操作)

unique_ptr和自定义析构函数有什么关系导致代码编译失败?有没有简单的解决方法?

谢谢。

最佳答案

定义自定义析构函数会禁用默认移动构造函数和移动赋值运算符的生成。因此使用了 push_back(const A&),但是 A 也没有复制构造函数,因为它有 unique_ptr 成员。

解决方案是手动将它们定义为default。但是定义移动构造函数会禁用默认构造函数:

struct A
{
~A() {};
A()=default;
A(A&&)=default;
A& operator=(A&&)=default;
std::unique_ptr<int> an_int;

};
static_assert(std::is_nothrow_move_constructible_v<A>);
static_assert(std::is_nothrow_move_assignable_v<A>);

关于c++ - 具有 unique_ptr 成员和自定义析构函数的对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63764971/

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