Warnung C26432

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

C++-Kernrichtlinien:
C.21: Wenn Sie alle Standardvorgänge definieren oder =löschen, definieren oder =löschen

Spezielle Vorgänge wie Konstruktoren werden angenommen, um das Verhalten von Typen zu ändern, sodass sie mehr auf Sprachmechanismen angewiesen sind, um bestimmte Szenarien automatisch zu erzwingen. Das kanonische Beispiel ist die Ressourcenverwaltung. Wenn Sie einen dieser speziellen Vorgänge explizit definieren, standardisieren oder löschen, signalisiert es, dass Sie eine spezielle Behandlung eines Typs vermeiden möchten. Es ist inkonsistent, die anderen Vorgänge nicht angegeben zu lassen, d. h. implizit vom Compiler gelöscht.

Hinweise

Diese Überprüfung implementiert die Regel von fünf, die die folgenden Vorgänge als spezial behandelt:

  • Kopieren von Konstruktoren,
  • Konstruktoren verschieben,
  • Zuweisungsoperatoren kopieren,
  • Zuordnungsoperatoren verschieben und
  • Destruktoren.

Die Regel überprüft nicht, ob Vorgänge auf die gleiche Weise definiert sind. Es ist in Ordnung, gelöschte und standardmäßige Vorgänge mit explizit definierten Vorgängen zu kombinieren. Sie müssen jedoch alle angeben, wenn Sie eine davon angeben.

Zugriffsstufen sind nicht wichtig und können auch gemischt werden.

Die Warnung kennzeichnet die erste nicht statische Funktionsdefinition eines Typs einmal pro Typ.

Beispiel

In diesem Beispiel warning::S wird nur ein Standardkonstruktor und ein Destruktor definiert. Die no_warning::S Deklaration definiert oder löscht alle fünf speziellen Memberfunktionen.

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