Udostępnij za pośrednictwem


Ostrzeżenie C26432

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

Podstawowe wytyczne dotyczące języka C++:
C.21: Jeśli zdefiniujesz lub =usuń dowolną operację domyślną, zdefiniuj lub =usuń je wszystkie

Zakłada się, że operacje specjalne, takie jak konstruktory, zmieniają zachowanie typów, więc polegają bardziej na mechanizmach językowych w celu automatycznego wymuszania określonych scenariuszy. Przykładem kanonicznym jest zarządzanie zasobami. Jeśli jawnie zdefiniujesz, domyślnie lub usuniesz dowolną z tych specjalnych operacji, sygnalizujesz, że chcesz uniknąć żadnej specjalnej obsługi typu. Jest niespójne, aby pozostawić inne operacje nieokreślone, czyli niejawnie zdefiniowane jako usunięte przez kompilator.

Uwagi

Ta kontrola implementuje regułę pięciu, która traktuje następujące operacje jako specjalne:

  • konstruktory kopii,
  • konstruktory przenoszenia,
  • operatory przypisania kopiowania,
  • operatory przypisania przenoszenia i
  • Destruktory.

Reguła nie sprawdza, czy operacje są zdefiniowane w taki sam sposób. Dobrze jest mieszać usunięte i domyślne operacje z jawnie zdefiniowanymi operacjami. Należy jednak określić wszystkie z nich, jeśli określisz dowolną z nich.

Poziomy dostępu nie są ważne i mogą być również mieszane.

Ostrzeżenie flaguje pierwszą niestacyjną definicję funkcji typu raz na typ.

Przykład

W tym przykładzie warning::S zdefiniowano tylko konstruktor domyślny i destruktor. Deklaracja no_warning::S definiuje lub usuwa wszystkie pięć specjalnych funkcji składowych.

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