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