Sdílet prostřednictvím


Upozornění C26432

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

Pokyny pro C++ Core:
C.21: Pokud definujete nebo =odstraníte jakoukoli výchozí operaci, definujte nebo =odstraňte všechny

Předpokládá se, že speciální operace, jako jsou konstruktory, mění chování typů, takže spoléhají více na mechanismy jazyka, aby automaticky vynucovaly konkrétní scénáře. Kanonický příklad je správa prostředků. Pokud explicitně definujete, výchozí nebo odstraníte některou z těchto speciálních operací, signalizuje, že se chcete vyhnout jakémukoli speciálnímu zpracování typu. Je nekonzistentní ponechat ostatní operace nezadané, tj. implicitně definované jako odstraněné kompilátorem.

Poznámky

Tato kontrola implementuje pravidlo pěti, které zpracovává následující operace jako zvláštní:

  • kopírovacích konstruktorů,
  • konstruktory pohybu,
  • kopírované operátory přiřazení,
  • přesunout operátory přiřazení a
  • Destruktory.

Pravidlo nekontroluje, jestli jsou operace definované stejným způsobem. Je v pořádku kombinovat odstraněné a výchozí operace s explicitně definovanými operacemi. Pokud ale zadáte některou z nich, musíte je zadat.

Úrovně přístupu nejsou důležité a dají se také kombinovat.

Upozornění označí první definici nestatické funkce typu jednou za typ.

Příklad

V tomto příkladu warning::S definuje pouze výchozí konstruktor a destruktor. Deklarace no_warning::S definuje nebo odstraní všechny pět speciálních členských funkcí.

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