경고 C26432

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

C++ 핵심 지침:
C.21: 기본 작업을 정의하거나 삭제하는 경우 모두 정의하거나 삭제합니다.

생성자와 같은 특수 작업은 특정 시나리오를 자동으로 적용하기 위해 언어 메커니즘에 더 많이 의존하도록 형식의 동작을 변경하는 것으로 간주됩니다. 정식 예제는 리소스 관리입니다. 이러한 특수 작업을 명시적으로 정의, 기본값 또는 삭제하면 형식의 특수한 처리를 방지하려는 메시지가 표시됩니다. 다른 작업을 지정되지 않은 상태로 두는 것은 일관성이 없습니다. 즉, 컴파일러에서 삭제된 것으로 암시적으로 정의됩니다.

설명

이 검사 다음 작업을 특수로 처리하는 5개의 규칙을 구현합니다.

  • 복사 생성자,
  • 이동 생성자,
  • 복사 할당 연산자,
  • 이동 할당 연산자 및
  • 소멸자.

작업이 동일한 방식으로 정의된 경우 규칙은 검사 않습니다. 삭제된 작업과 기본값을 명시적으로 정의된 작업과 혼합해도 됩니다. 그러나 모든 항목을 지정하는 경우 모두 지정해야 합니다.

액세스 수준은 중요하지 않으며 혼합될 수도 있습니다.

경고는 형식당 한 번씩 형식의 첫 번째 비정적 함수 정의에 플래그를 지정합니다.

예시

이 예제에서는 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;
}