默认移动构造、默认移动赋值自动生成的条件

一、默认移动构造函数什么时候会自动生成?

如果需要用一个右值去拷贝构造一个类对象或赋值给一个类对象,则在该类自定义了移动构造函数/移动赋值函数的情况下,会调用该类自定义的移动构造函数/移动赋值函数

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

  1. 没有声明拷贝构造函数
  2. 没有声明赋值运算符
  3. 没有声明析构函数

二、默认移动赋值什么时候会自动生成?

  1. 没有声明拷贝赋值函数。
  2. 没有声明拷贝构造函数。
  3. 没有声明移动构造函数。
  4. 移动赋值函数没有隐式声明为delete。
  5. 没有声明析构函数。

猜你喜欢

转载自blog.csdn.net/AkieMo/article/details/132126458