一、默认移动构造函数什么时候会自动生成?
如果需要用一个右值去拷贝构造一个类对象或赋值给一个类对象,则在该类自定义了移动构造函数/移动赋值函数的情况下,会调用该类自定义的移动构造函数/移动赋值函数
而在没有自定义移动构造函数/移动赋值函数的情况下,如果该类自定义了拷贝构造函数/赋值运算符或析构函数之一,都只会调用拷贝构造函数/赋值运算符(前提是形参为const T&而不是T&,因为const T&可以兼容右值实参,而T&不能)而不会生成默认移动构造函数。注意即使没有自定义拷贝构造函数/赋值运算符,只自定义了析构函数,也不会生成默认移动构造函数,这是因为自定义析构函数表明该类在析构时可能需要回收内存,如果生成了默认移动构造函数可能会出错(比如同一地址被释放两次的错误)
- 没有声明拷贝构造函数
- 没有声明赋值运算符
- 没有声明析构函数
二、默认移动赋值什么时候会自动生成?
- 没有声明拷贝赋值函数。
- 没有声明拷贝构造函数。
- 没有声明移动构造函数。
- 移动赋值函数没有隐式声明为delete。
- 没有声明析构函数。