如何禁止复制构造函数并仅使用移动构造函数?

时间:2014-05-31 17:34:06

标签: c++ c++11 copy-constructor

在以下场景中(它只是一个 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上的相关内容,但仍无法找到,如果重复,请发表评论,我将删除该问题。

1 个答案:

答案 0 :(得分:5)

移动构造函数通常如下所示:

Foo(Foo&& other)

您还必须在组件上明确使用std::move

然后,delete复制构造函数:

Foo(Foo const&) = delete;

如果你有一个用户提供的移动构造函数,也可以单独省略它们。