次の方法で共有


警告 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: いずれかの既定の操作を定義または削除する場合、それらをすべて定義または削除する

コンストラクターなどの特殊な操作は、特定のシナリオを自動的に適用するために言語メカニズムに依存する型の動作を変更すると想定されます。 標準的な例は、リソース管理です。 これらの特殊な操作を明示的に定義、既定、または削除した場合は、型の特別な処理を回避する必要があることを示します。 他の操作を指定しないままにしたり、コンパイラによって削除されたとして暗黙的に定義したりするには、一貫性がありません。

解説

このチェックはルール オブ ファイブを実装し、次の操作を特別に扱います。

  • コピー コンストラクター
  • 移動コンストラクター
  • コピー代入演算子
  • 移動代入演算子
  • デストラクター

このルールでは、操作が同じ方法で定義されているかどうかはチェックされません。 削除された操作および既定の操作が明示的に定義された操作と混在しても問題ありません。 ただし、それらを指定する場合は、すべて指定する必要があります。

アクセス レベルは重要ではなく、混在させることができます。

警告は、型の最初の非静的関数定義に対して、型ごとに 1 回フラグを設定します。

この例で、warning::S は既定のコンストラクターとデストラクターのみを定義します。 no_warning::S 宣言では、5 つの特殊なメンバー関数すべてが定義または削除されます。

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