cppcoreguidelines-special-member-functions¶
该检查查找类,这些类中定义了部分特殊成员函数,但没有定义全部。
默认情况下,编译器定义一个复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数。可以通过显式用户定义来抑制默认值。关于哪些函数将被其他函数的定义所抑制的关系很复杂,建议将所有五个函数全部设为默认值或显式定义。
注意,定义带有 = delete
的函数被认为是定义。
此检查实现 C++ 核心指南中的 C.21。
选项¶
- AllowSoleDefaultDtor¶
当设置为 true(默认值为 false)时,此检查仅在析构函数被定义而非设为默认值时才会触发。
struct A { // This is fine. virtual ~A() = default; }; struct B { // This is not fine. ~B() {} }; struct C { // This is not checked, because the destructor might be defaulted in // another translation unit. ~C(); };
- AllowMissingMoveFunctions¶
当设置为 true(默认值为 false)时,此检查不会标记根本没有定义移动操作的类。它仍然会标记仅定义移动构造函数或移动赋值运算符之一的类。启用此选项后,以下类将不会被标记
struct A { A(const A&); A& operator=(const A&); ~A(); };
- AllowMissingMoveFunctionsWhenCopyIsDeleted¶
当设置为 true(默认值为 false)时,此检查不会标记定义了已删除的复制操作但没有定义移动操作的类。此标志与 Google C++ 风格指南 可复制和可移动类型 相关。启用此选项后,以下类将不会被标记
struct A { A(const A&) = delete; A& operator=(const A&) = delete; ~A(); };
- AllowImplicitlyDeletedCopyOrMove¶
当设置为 true(默认值为 false)时,此检查不会标记隐式删除复制或移动操作的类。启用此选项后,以下类将不会被标记
struct A : boost::noncopyable { ~A() { std::cout << "dtor\n"; } };