1

我有持有指针并与他人共享它们的对象。移动它们很好,但不能复制。我想将它们存储在矢量和地图中。以下代码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&& ...) [with _T1 = A; _Args = {A}]': ... 错误:使用已删除的函数 'OnlyMove::OnlyMove(const OnlyMove&)'

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

现场演示

4

1 回答 1

3

你需要:

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

当你引入析构函数时,移动构造函数就消失了。如果没有移动构造函数或复制构造函数,它就不能放在向量中。

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

于 2019-02-20T13:54:45.667 回答