Необходимость объявления деструктора по умолчанию

В соответствии с этими рекомендациями:

Если требуется деструктор по умолчанию, но его генерация была (например, определяя конструктор перемещения), используйте =default.

Я не могу представить, когда код был бы плохо сформирован без явного деструктора по умолчанию в классе, который имеет конструктор перемещения.

Может ли кто-нибудь показать мне пример, подтверждающий цитирование выше?

struct S {
    S() {};
    S( S&& ) {}; // move ctor
};

int main() {
    S s; // there is no need to declare dtor explicitly =default
}

Ответ 1

Я думаю, что это будет какая-то ошибка, неявное объявление деструктора по умолчанию не должно иметь ничего общего с определением конструктора перемещения.

Из стандартного, 12.4 $4,5 деструкторов [class.dtor]

4 Если класс не имеет объявленного пользователем деструктора, деструктор неявно объявлен как дефолт (8.4). Неявно объявленная Деструктор является встроенным публичным членом своего класса.

5 Деструктор по умолчанию для класса X определяется как удаленный, если:

(5.1) - X является объединенным классом, который имеет вариантный член с нетривиальный деструктор,

(5.2) - любой потенциально сконструированный подобъект имеет тип класса M (или массив), а M имеет удаленный деструктор или деструктор, который является недоступный от дефолтного деструктора,

(5.3) - или, для виртуального деструктора, поиск не-массива функция дезадаптации приводит к двусмысленности или функции, которая удаленный или недоступный из дефолтного деструктора.