Нет. Неявно определенный, тривиальный деструктор по определению тривиален :) Разница между объявлением и определением вещи в том, что для того, чтобы компилятор даже увидел , что деструктор доступен, всегда должно быть объявление. Так что, если вы не предоставите один, он неявно предоставит один.
Но теперь он также определит его, если это необходимо (если объект этого типа класса уничтожен). В любом случае, он должен что-то сделать: он должен вызывать деструкторы всех своих членов и базовых классов. Простой пример, который иллюстрирует эффект неявного определения деструктора:
struct a {
private:
~a();
};
struct bug {
// note: can't be destructed
a a_;
};
Как только вы попытаетесь создать локальный объект ошибки, компилятор выдаст сообщение об ошибке, потому что он дает определение деструктора ошибки, который пытается вызвать недоступный деструктор.
Теперь я думаю, что тривиальность деструкторов / конструкторов в основном используется для наложения ограничений на вашу программу. Например, объекты, имеющие нетривиальные версии, нельзя объединять в союзы. С другой стороны, вы можете удалить объект, имеющий неполный тип, при условии, что у него есть тривиальный деструктор. Обратите внимание, что если ваша программа не может решить, был ли фактически определен тривиальный деструктор, компилятору разрешено опустить его определение. Это так называемое правило as-if
. Компилятор должен вести себя так, как будто он соответствует стандарту - оптимизации не имеют значения, если они не меняют смысла программы.