警告 C26432

If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).

C++ Core Guidelines:
C.21:如果定义或删除任何默认操作,请定义或删除所有操作

假设构造函数等特殊操作会更改类型的行为,那么在自动强制执行特定方案时更依赖于语言机制。 典型的示例是资源管理。 如果显式定义、默认或删除任何这些特殊操作,则表明你希望避免对类型进行任何特殊处理。 不指定其他操作是不一致的,即隐式定义为由编译器删除。

备注

此检查实现第五项规则,该规则将以下操作视为特殊操作

  • 复制构造函数、
  • 移动构造函数、
  • 复制赋值运算符、
  • 移动赋值运算符和
  • 析构函数。

该规则不会检查操作是否以相同的方式定义。 可以将删除操作和默认操作与显式定义的操作混合使用。 但是,如果指定其中任何一项,则必须全部指定。

访问级别并不重要,也可以混合使用。

该警告标记类型的第一个非静态函数定义,每个类型一次。

示例

在此示例中,warning::S 仅定义一个默认构造函数和一个析构函数。 no_warning::S 声明定义或删除所有五个特殊成员函数。

// C26432.cpp
namespace warning
{
    struct S
    {
        S() noexcept { ++_count; }
        ~S() { --_count; } // C26432 because only the constructor and destructor are explicitly defined.
        static unsigned _count;
    };
    unsigned S::_count = 0;
}

namespace no_warning
{
    struct S
    {
        S() noexcept { _count++;  }
        S(const S&) = delete;
        S(S&&) = delete;
        S& operator=(const S&) = delete;
        S& operator=(S&&) = delete;
        ~S() { --_count; }
        static unsigned _count;
    };
    unsigned S::_count = 0;
}