C++中的一个常见模式是将复制构造函数设为私有:
class A
{
public:
// ...
private:
A(const A&);
};
Run Code Online (Sandbox Code Playgroud)
但是下面的代码会编译(在C++ 11/14中):
A f();
auto a = f();
Run Code Online (Sandbox Code Playgroud)
该标准包含有关自动生成移动构造函数的信息.我既无法访问标准,也无法访问实际生成移动构造函数的编译器.我的问题是:我必须写
class A
{
public:
// ...
private:
A(const A&);
A(const A&&);
};
Run Code Online (Sandbox Code Playgroud)
防止移动(和运营商=类似)?
And*_*owl 14
但是下面的代码会编译(在C++ 11/14中):
不,它不会.用户声明的复制构造函数的存在应该禁止隐式生成移动构造函数.根据C++ 11标准的第12.8/9段:
如果类X的定义没有显式地声明一个移动构造函数,那么当且仅当一个移动构造函数被隐式声明为默认值时
- X没有用户声明的复制构造函数,
- X没有用户声明的复制赋值运算符,
- X没有用户声明的移动赋值运算符,
- X没有用户声明的析构函数,和
- 移动构造函数不会被隐式定义为已删除.
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |