在以下场景中(它只是一个 sscce ),如何避免复制构造函数(注释掉的代码)?
typedef boost::variant< std::vector<int>,
std::vector<char>,
std::vector<float>
> VecRMPType;
struct Widgets{
int widget_id;
VecRMPType rmps_vec ;
template< typename T>
Widgets(int wid, T rmps_vec_ ) :
widget_id(wid), rmps_vec( std::move(rmps_vec_) )
{
}
Widgets( const Widgets&& wids_ ) :
widget_id( wids_.widget_id), rmps_vec(wids_.rmps_vec )
{
}
/*
// This constructor I want to disable.
Widgets( const Widgets& wids_ ):
widget_id( wids_.widget_id), rmps_vec( std::move(wids_.rmps_vec) )
{
}
*/
};
class Layers {
int symb_id;
std::vector< Widgets > widgets ;
Layers(const Layers& ) ;
Layers& operator=(const Layers& ) ;
public:
Layers(int sid_, std::vector<Widgets> wids_ ):
symb_id(sid_), widgets(std::move(wids_) )
{ }
Layers(const Layers&& L_ ):
symb_id(L_.symb_id), widgets( std::move(L_.widgets) )
{ }
};
目前,编译器抛出error
我是否遗漏了一些明显或有任何误解的内容?
PS:我尝试搜索SO上的相关内容,但仍无法找到,如果重复,请发表评论,我将删除该问题。
答案 0 :(得分:5)
移动构造函数通常如下所示:
Foo(Foo&& other)
您还必须在组件上明确使用std::move
。
然后,delete
复制构造函数:
Foo(Foo const&) = delete;
如果你有一个用户提供的移动构造函数,也可以单独省略它们。