考虑一下:
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>]’
答案 0 :(得分:2)
emplace_back
将适用于此。它调用最合适的构造函数而不是复制构造函数。