Предупреждение 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;
}