При чтении Bjarne Stroustrup CoreCppGuidelines я нашел руководство, которое противоречит моему опыту.
C.21 требует следующее:
Если вы определяете или
=delete
любую операцию по умолчанию, определите или=delete
все они
По следующей причине:
Семантика специальных функций тесно связана, поэтому, если нужно быть нестандартным, шансы на то, что другие тоже нуждаются в модификации.
По моему опыту, две наиболее распространенные ситуации переопределения операций по умолчанию следующие:
# 1: определение виртуального деструктора с телом по умолчанию для разрешения наследования:
class C1
{
...
virtual ~C1() = default;
}
# 2: Определение конструктора по умолчанию, выполняющего некоторую инициализацию элементов, типизированных для RAII:
class C2
{
public:
int a; float b; std::string c; std::unique_ptr<int> x;
C2() : a(0), b(1), c("2"), x(std::make_unique<int>(5))
{}
}
Все другие ситуации были редкостью в моем опыте.
Что вы думаете об этих примерах? Являются ли они исключением из правила C.21 или лучше определить все операции по умолчанию здесь? Существуют ли какие-либо другие частые исключения?