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&&);
};
以防止移动(和运营商=类似)?
答案 0 :(得分:14)
但是下面的代码会编译(在C ++ 11/14中):
不,它不会。用户声明的复制构造函数的存在应该禁止隐式生成移动构造函数。根据C ++ 11标准的第12.8 / 9段:
如果类X的定义没有显式声明移动构造函数,则会隐式声明一个 当且仅当
时默认为- X没有用户声明的复制构造函数,
- X没有用户声明的复制赋值运算符
- X没有用户声明的移动赋值运算符
- X没有用户声明的析构函数,
- 移动构造函数不会被隐式定义为已删除。