Идеальный класс не содержит ни одного из пяти методов. Это не лень — это архитектурный принцип, который снижает количество багов.
🍒 Rule of Zero
Если каждое поле само корректно управляет своим ресурсом (
std::string, std::vector, std::unique_ptr), то классу-агрегату не нужны свои Fab Four. Компилятор сгенерирует правильные почленные версии.struct User {
std::string name;
std::vector<int> scores;
std::unique_ptr<Db> conn;
};
// move + dtor — сгенерированы, корректны и БЕСПЛАТНЫ
// copy — корректно УДАЛЁН: unique_ptr некопируем → User тоже (move-only тип)❗️Почему работает: почленное перемещение вызовет move у каждого поля.
string украдёт буфер, vector — массив, unique_ptr — указатель. Тебе не нужно писать ни строки.❗️ Ключевое условие — не объявлять деструктор. И
~User(){}, и ~User() = default одинаково опасны: любой user-declared деструктор отключает неявную генерацию move.✏️ Твои классы владеют new/delete напрямую — или прячут их в unique_ptr и живут по Rule of Zero?
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом