Classes and class hierarchies
C.20
Если можно избежать определения операций по умолчанию — избегайте
Причина
Это простейший подход, дающий наиболее чистую семантику.
Пример
struct Named_map {
public:
explicit Named_map(const string& n) : name(n) {}
// нет конструкторов копирования/перемещения
// нет операторов копирующего/перемещающего присваивания
// нет деструктора
private:
string name;
map<int, int> rep;
};
Named_map nm("map"); // конструирование
Named_map nm2 {nm}; // конструирование копированием
Поскольку std::map и string имеют все специальные функции, никакой дополнительной работы не требуется.
Примечание
Это известно как «правило нуля».
Контроль
(Не применимо для автоматической проверки) Хотя это и не проверяемо, хороший статический анализатор может выявить паттерны, указывающие на возможное улучшение для соответствия этому правилу. Например, класс с парой членов (указатель, размер) и деструктором, который delete-ит указатель, вероятно, можно преобразовать в vector.