std ::将不可复制的对象移动到向量中

时间:2015-07-05 17:21:50

标签: c++11

考虑一下:

struct A{};
struct B
{
    // make object non-copyable
    B ( const B & )                 = delete;
    B & operator= ( const B & )     = delete;

    B(){};
    std::unique_ptr<A> pA;
};

int main()
{
    B b;
    std::vector<B> vb;

    vb.push_back(std::move(b));

    return 0;
}

错误:

../src/Sandbox.cpp:24:27:   required from here
/usr/include/c++/4.7/bits/stl_construct.h:77:7: error: use of deleted function ‘B::B(const B&)’

谁在调用已删除的复制构造函数?我试图移动对象而不复制它,因为它有一个unique_ptr成员。

根据评论员的建议:

我试图实现一个移动构造函数:

B ( const B && rhs_ )
{
    pA = std::move(rhs_.pA); // error below
}

并将push_back(std::move(b))替换为emplace_back(std::move(b))

我收到了这个错误

../src/Sandbox.cpp:17:25: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = A; _Dp = std::default_delete<A>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<A>]’

1 个答案:

答案 0 :(得分:2)

emplace_back将适用于此。它调用最合适的构造函数而不是复制构造函数。