То, определена ли функция, не является чем-то, что определяется во время выполнения, поэтому деструктор не может быть определен как ", только когда объект [..] имеет значение около , подлежащее уничтожению "просто потому, что ваш исполняемый файл статичен и не создан для определенного запуска.
Однако, если в конечном исполняемом файле нет вызовов вашего деструктора, компоновщик может выбрать будет полностью исключать функцию.
В качестве последнего пункта рассмотрим следующий пример:
class A {
A() {}
~A() {}
};
class B {
A a; // cannot access dtor nor ctor of A
};
Если вы никогда не создавали экземпляр B
этогофактически скомпилирует и скомпонует, потому что B::B()
и B::~B()
никогда не синтезируются.Однако, если вы попытаетесь создать объект B
, компилятор назовет вас красочными именами просто потому, что вы заставили его синтезировать B::B()
и B::~B()
, чего он не может сделать.