问题一 什么时候编译器会生成默认的移动构造函数或移动赋值函数?
注意:如果手动创建了拷贝相关函数,那么默认的移动相关函数会被delete,并且在应该调用移动相关函数的时候,转而调用拷贝相关函数。
问题二 当成员中有不可拷贝的成员时候,默认拷贝相关函数会被delete,此时可以使用move函数调用移动相关函数。
问题三 同理问题二,如果有不可移动成员,默认移动相关函数会被delete
原理:
默认拷贝相关函数会对成员依次拷贝,如果成员不可拷贝,自然无法生成默认拷贝相关函数。
同理,移动相关函数会对成员递归调用move进行移动,如果成员不可移动,自然无法生成移动相关函数。
因此必要时候需要自行构建,特别注意移动相关函数的参数不同于拷贝相关函数,参数不能加const,因为移动会改变被移动对象。