В одной ситуации деструктор никогда не будет вызван, даже для автоматических переменных: деструктор для анонимного объединения внутри класса X
, когда пользователь пишет явный деструктор X::~X
.Поскольку объединение является анонимным, просто нет способа, которым его деструктор может быть вызван X::~X
(теперь он не как называет деструктор, потому что он не знает , что длявызовите деструктор).
Кстати, в этой ситуации пользователь не может объявить удаляемый деструктор объединения (опять же из-за отсутствия имени), но это может быть неявно Удалено.
Любопытно, что в этой ситуации деструктор по умолчанию X::~X
вызвал бы деструктор для анонимного объединения.Однако всякий раз, когда это разрешено, это чисто формальный вопрос, и вызов деструктора не действует.Это потому, что это допустимо, только если все варианты объединения имеют тривиальные деструкторы (и, следовательно, сам союз);если у любого из них есть нетривиальный деструктор, то деструктор объединения неявно удаляется, что делает деструктор по умолчанию X
неработоспособным (эффективно удаляемым).
Однако это не означает, что нельзя использоватькласс X
, содержащий анонимный союз, по крайней мере, с одним членом с нетривиальным деструктором.Это просто означает, что написанный пользователем X::~X
должен непосредственно уничтожить активный вариант анонимного объединения, минуя удаленный деструктор самого объединения.Это возможно при условии, что класс содержит дополнительные члены, позволяющие узнать, какой вариант активен.Аналогично, конструкторы X
должны напрямую создавать не более одного варианта объединения, минуя (возможно, удаленный) конструктор анонимного объединения (если вариант не является POD, такой конструктор не должен вместо этого непосредственно присваиватьвариант объединения).На самом деле специальные функции-члены анонимного объединения являются своего рода фантомными сущностями, которые не могут быть нетривиальными, и чья единственная роль, возможно, при удалении, заключается в эффективном распространении этого удаленного статуса на соответствующую специальную функцию-член, содержащую X
.