2013-07-05 131 views
9

在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

如果你写了一个拷贝构造函数,它不会生成一个移动构造函数。 –

+2

用户声明的副本禁止生成移动成员。 – Xeo

+3

请注意,您提到的模式是针对C++ 98/03的,但现在在C++ 11中已弃用,这要感谢“delete”构造函数/赋值运算符(例如'ClassName(ClassName &&)= delete; '显式地阻止隐式移动构造函数)。 – syam

回答

13

但是将以下代码然后编译(在C++ 11/14):

不,它不会。用户声明的拷贝构造函数的存在应该禁止隐式生成移动构造函数。每款C++ 11标准的12.8/9:

如果一个类X的定义不明确宣布此举的构造函数,一个将被隐式声明 欠缴当且仅当

- X没有一个用户声明的拷贝构造函数

- X没有一个用户声明的拷贝赋值运算符,

- X没有一个用户声明的举动赋值运算符,

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

- 此举构造不会被隐式定义为删除。

+0

太棒了!我再次对此印象深刻! :-) – Petter

+0

@Ben:很高兴帮助:) –