Чтобы ответить на вторую часть, «почему деструктор базового класса не был вызван?», 12.4 / 6:
После выполнения тела деструктора и уничтожения любых автоматических объектов, размещенных в теледеструктор для класса X вызывает деструкторы для прямых членов X, деструкторы для прямых базовых классов X ... Оператор return (6.6.3) в деструкторе не может напрямую возвращаться вызывающей стороне;перед передачей управления вызывающей стороне деструкторы для членов и баз вызываются.
Это не говорит о том, что деструкторы-члены и базы вызываются, если деструктор выбрасывает.Однако в 15.2 / 2 говорится:
Для объекта, который частично построен или частично уничтожен, будут выполняться деструкторы для всех полностью построенных подобъектов,
Я думаю, что это должнобыть истинным независимо от того, является ли объект «частично разрушенным» из-за исключения, выданного из тела деструктора, или из-за исключения, выданного из блока функции try деструктора.Я вполне уверен, что «после тела деструктора» должно означать также после блока try функции.
Однако, очевидно, Microsoft не согласна, и из-за блока try функции, который она не сгенерировала »тело деструктора ", и не сделал того, что происходит после выполнения" тела деструктора ".
Это не звучит мне правильно.GCC 4.3.4 выполняет деструктор базового класса, независимо от того, выполняет ли функция производного класса dtor блок try или нет.В случае, когда он выбрасывает, база уничтожается до выполнения предложения catch.