将对象从不可复制派生到向量中

时间:2019-02-20 13:46:54

标签: c++ inheritance c++17 move-semantics emplace

我有一些持有指针并与他人共享的对象。移动它们很好,但不能复制。我想将它们存储在矢量和地图中。当A没有析构函数时,以下代码仅起作用。但是,我需要一个析构函数来清理指针。

#include <vector>

struct OnlyMove
{
    OnlyMove(const OnlyMove&) = delete;
    OnlyMove& operator=(const OnlyMove&) = delete;
    OnlyMove(OnlyMove&&) = default;
    OnlyMove& operator=(OnlyMove&&) = default;

protected:
    OnlyMove() = default;
};

struct A : OnlyMove
{
    A(int){}
    ~A(){} // makes compilation fail
};

int main()
{
    std::vector<A> y;
    y.emplace_back(1);
}

拥有析构函数时的错误:

  

/ usr / local / include / c ++ / 8.2.0 / bits / stl_construct.h:在'void std :: _ Construct(_T1 *,_Args && ...)[带有_T1 = A; _Args = {A}]':   …   错误:使用已删除的功能'OnlyMove :: OnlyMove(const OnlyMove&)'

我不明白为什么。析构函数在这里扮演什么角色?

Live Demo

1 个答案:

答案 0 :(得分:3)

您需要:

struct A : OnlyMove
{
    A(int){}
    A(A&&) = default;  // need this
    ~A() {} 
}; 

当您引入解扰器时,move构造函数将消失。没有move构造函数或copy构造函数,就不能将其放置在向量中。

编辑:move构造函数最好是noexcept,否则抛出异常时std::vector::resizestd::vector::push_back不能保证。