具有unique_ptr成员和自定义析构函数的对象的向量

ASMateus

假定以下代码将类型的对象移动Aav(向量)中:

#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和导致代码无法编译的自定义析构函数之间有什么关系有一个简单的解决方法吗?

谢谢。

昆比

定义自定义析构函数将禁用默认move构造函数和move赋值运算符的生成。使用因而push_back(const A&),但A由于具有unique_ptr成员因此也没有副本构造函数

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

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>);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

具有自定义析构函数的“不可复制”

如何通过使用自定义构造函数而不调用析构函数来创建具有初始大小的向量?

在具有受保护的析构函数的类中使用unique_ptr

当基类具有受保护的析构函数时,创建unique_ptr <Base>

unique_ptr析构函数的优势

具有自定义删除器的unique_ptr构造函数被删除

具有自定义指针类型的unique_ptr:* get()和operator *()给出不同的输出

具有私有构造函数和析构函数的类对象的向量?

std :: unique_ptr析构函数构造函数顺序

具有unique_ptr成员的对象的错误C2280向量

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

当包含它的对象调用其析构函数时,unique_ptr是否会取消分配?

将具有自定义删除器的unique_ptr移到shared_ptr

unique_ptr :: release()是否调用析构函数?

使用unique_ptr保护的析构函数

unique_ptr 两次调用析构函数

为什么在使用unique_ptr时没有调用析构函数?

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

如何构造具有unique_ptr成员的对象?

我需要返回具有unique_ptr成员的对象?

如何修复具有unique_ptr的对象的向量

为什么要为具有非平凡析构函数的类声明constrexpr构造函数(例如unique_ptr,std :: variant)

具有shared_ptr的成员的C ++析构函数顺序

对象向量的析构函数

unique_ptr 的有状态自定义删除器

如何允许 std::unique_ptr 访问类的私有析构函数或使用私有析构函数实现 C++ 工厂类?

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

TOP 榜单

热门标签

归档