存在任一拷贝、移动、析构相关的函数时,应定义所有相关函数
5.1.9 ID_violateRuleOfFive
五个紧密相关的函数:
- 拷贝构造函数
- 拷贝赋值运算符
- 析构函数
- 移动构造函数
- 移动赋值运算符
当这五个函数中的任何一个函数被定义时,说明对象在资源管理等方面有特定的需求,其他四个函数也需要被定义,否则难以适应各种应用场景,易产生意料之外的错误,这种规则称为“Rule of five”。如果缺少某个函数,编译器会生成相关默认函数,但其特定需求不会被实现。
如果确实不需要某个函数,也应将其明确地设定为 private 或 =delete,如果确实只需要默认处理,应将其声明为 =default,这样可明确对象的行为,规避意料之外的错误。
本规则适用于遵循 C++11 及之后标准的代码,对于遵循 C++03 及之前标准的代码,本规则特化为 ID_missingCopyConstructor、ID_missingCopyAssignOperator、ID_missingDestructor。
另外,如果类只负责成员对象的包装或组合而没有特殊的复制、移动、析构需求时,这些函数就都不要定义,参见 ID_violateRuleOfZero。