是一个私人移动构造函数,以防止移动?

时间:2013-07-05 16:11:42

标签: c++ c++11

C ++中的一个常见模式是将复制构造函数设为私有:

class A
{
    public:
        // ...
    private:
        A(const A&);
};

但是下面的代码会编译(在C ++ 11/14中):

A f();

auto a = f();

该标准包含有关自动生成移动构造函数的信息。我既无法访问标准,也无法访问实际生成移动构造函数的编译器。我的问题是:我必须写

class A
{
    public:
        // ...
    private:
        A(const A&);
        A(const A&&);
};

以防止移动(和运营商=类似)?

1 个答案:

答案 0 :(得分:14)

  

但是下面的代码会编译(在C ++ 11/14中):

不,它不会。用户声明的复制构造函数的存在应该禁止隐式生成移动构造函数。根据C ++ 11标准的第12.8 / 9段:

  

如果类X的定义没有显式声明移动构造函数,则会隐式声明一个   当且仅当

时默认为      

- X没有用户声明的复制构造函数

     

- X没有用户声明的复制赋值运算符

     

- X没有用户声明的移动赋值运算符

     

- X没有用户声明的析构函数,

     

- 移动构造函数不会被隐式定义为已删除。