Поделиться через


Предупреждение C26432

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

Основные рекомендации по C++
C.21. Если вы определяете или =удаляете любую операцию по умолчанию, определите или =удалите их все

Предполагается, что специальные операции, такие как конструкторы, изменяют поведение типов, поэтому они используют больше языковых механизмов для автоматического применения конкретных сценариев. Канонический пример — управление ресурсами. Если вы явно определяете, по умолчанию или удаляете любую из этих специальных операций, она сигнализирует, что вы хотите избежать какой-либо специальной обработки типа. Несогласованно оставить другие операции неуказаны, то есть неявно определено как удаленные компилятором.

Замечания

Эта проверка реализует правило пяти, которое обрабатывает следующие операции как специальные:

  • конструкторы копирования,
  • конструкторы перемещения,
  • операторы назначения копирования,
  • перемещение операторов назначения и
  • Деструкторы.

Правило не проверяет, определены ли операции таким же образом. Это нормально смешивать удаленные и стандартные операции с явно определенными. Однако при указании любого из них необходимо указать все из них.

Уровни доступа не важны и также могут быть смешанными.

Предупреждение помечает первое нестатическое определение функции типа один раз на тип.

Пример

В этом примере warning::S определяет только конструктор по умолчанию и деструктор. Объявление no_warning::S определяет или удаляет все пять специальных функций-членов.

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