★19.关于移动操作
2017-06-30 本文已影响0人
iDragonfly
定义
class A {
public:
A(A &&) = default; // 显式定义移动构造操作
A & operator=(A &&) = default; // 显式定义移动赋值函数
virtual ~A() = default; // 一旦一个类定义了析构函数,此类及其派生类都不会合成移动操作
std::string i;
};
class B : public A {
public:
B(B &&) = default; // 显式定义移动赋值函数
B & operator=(B &&) = default; // 显式定义移动赋值函数
};
注意事项
- 当自己定义了(即使是=default的方式)其中一个普通拷贝控制成员(析构函数,拷贝构造函数,拷贝赋值运算符)或设置为=delete,就不会合成任何移动操作。
- 因为基类总是需要将析构函数设置为虚的,所以基类和其派生类总是不会合成移动操作,需要显式地定义移动操作。