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

C++11 std::将不可复制的对象移动到向量中,c++11,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::vect

考虑这一点:

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;
}
谁在调用已删除的副本构造函数?我正在尝试移动对象而不是复制它,因为它具有唯一的\u 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>]’
。/src/Sandbox.cpp:17:25:错误:使用删除的函数'std::unique\u ptr&std::unique\u ptr::operator=(const std::unique\u ptr&)[带Tp=A;Dp=std::default\u delete;std::unique\u ptr=std::unique\u ptr]'

向后安置
将为此工作。它调用最合适的构造函数,而不是复制构造函数。

请详细说明为什么会发生这种情况?此外,emplace_也给出了同样的结果error@Kam我想你的动作也被删除了。尝试将其设置为默认值。@Kam发生这种情况的原因是,按设计,push_back调用复制构造函数,而emplace_back将其参数传递给构造函数。@Kam move构造函数不应将参数作为常量。@Dani事实上,您有一个用户声明的复制构造函数(它与被删除无关)这会导致不隐式声明移动构造函数。只需默认移动构造函数即可工作(
B(B&&)=default
)。
../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>]’