Интересно, будет ли хорошей идеей всегда писать конструктор / деструктор, даже если я их не использую.
class Foo { public: Foo(){}; ~Foo(){}; };
Или лучше писать их только тогда, когда я их использую?
class Foo { public: };
Это плохая идея - определять пользовательские специальные функции-члены, когда их достаточно по умолчанию.
Вы потеряете сгенерированные по умолчанию операции перемещения, см. Имеет ли значение по умолчаниювиртуальный деструктор предотвращает сгенерированные компилятором операции перемещения?
Ваш класс больше не будет тривиальным, в результате чего распределение и освобождение, а контейнеры, удерживающие ваш класс, станут намного менее эффективными.
Определения по умолчанию могут быть автоматически noexcept, но вы потеряли это.
noexcept
Ваш класс больше не является агрегатом, поэтому вы не можете использоватьагрегатная инициализация.
Если вы сделаете деструктор виртуальным, как показано в вашем вопросе, вы также потеряете стандартную компоновку.