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"; }
};