Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).
Основные рекомендации по C++
C.21. Если вы определяете или какую-либо =delete функцию копирования, перемещения или деструктора, определите их все или =delete
Предполагается, что специальные операции, такие как конструкторы, изменяют поведение типов, поэтому они используют больше языковых механизмов для автоматического применения конкретных сценариев. Канонический пример — управление ресурсами. Если вы явно определяете, по умолчанию или удаляете любую из этих специальных операций, она сигнализирует, что вы хотите избежать какой-либо специальной обработки типа. Несогласованно оставить другие операции неуказаны, то есть неявно определено как удаленные компилятором.
Замечания
Эта проверка реализует правило пяти, которое обрабатывает следующие операции как специальные:
- конструкторы копирования,
- конструкторы перемещения,
- операторы назначения копирования,
- перемещение операторов назначения и
- Деструкторы.
Правило не проверяет, определены ли операции таким же образом. Это нормально смешивать удаленные и стандартные операции с явно определенными. Однако при указании любого из них необходимо указать все из них.
Уровни доступа не важны и также могут быть смешанными.
Предупреждение помечает первое нестатическое определение функции типа один раз на тип.
Пример
В этом примере 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;
}