Если класс имеет дело с владением ресурсом, то этот класс должен ТОЛЬКО управлять этим ресурсом.Это не должно делать ничего другого.В этом случае определите все 5 (правило 5).
Иначе, классу не нужно реализовывать ни одно из 5 (правило 0).
Просто так.
Теперь я видел, как эти правила сформулированы следующим образом: если класс определяет любой из 5, то он должен определять все из них.Ну да и нет.Причиной этого является то, что: если класс определяет любой из 5, то это сильный индикатор того, что класс должен управлять ресурсом, и в этом случае он должен определить все 5. Так, например, если вы определяете деструктор для освобожденияресурс, то класс находится в первой категории и должен реализовывать все 5, но если вы определяете деструктор просто для добавления некоторых операторов отладки или для ведения журнала, или потому что класс полиморфен, тогда класс не первая категория, поэтому вы нене нужно определять все 5.
Если ваш класс относится ко второй категории, и вы определяете хотя бы одну из 5, то вы должны явно =default
остальные из 5. Это потому, что правилакогда неявно объявляются cpy / move ctors / assignments, это немного сложно.Например, определение dtor предотвращает неявное объявление хода ctor & assigment
// because I have a custom constructor, I assume I need to also
// define copy constructors, move constructors, and a destructor.
Неверно.Пользовательский конструктор не является частью 5.
Все ваши классы должны следовать правилу 0, поскольку ни один из них не управляет ресурсами.
На самом деле это довольно редко для пользователяКод необходимо реализовать правило 5 класса.Обычно это реализовано в библиотеке.Таким образом, как пользователь, почти всегда по правилу 0.
Коры / назначения копирования / перемещения по умолчанию делают ожидаемую вещь: копии копируют каждого члена, а перемещения -переместить каждого члена.Что ж, при наличии элементов, которые не являются подвижными, или у которых есть только некоторые из 5, или у которых есть некоторые из 5 удаленных, тогда правила становятся немного более сложными, но нет неожиданного поведения.По умолчанию это хорошо.