class A { public: virtual ~A() { } }; class B : virtual public A { public: ~B() throw() {} }; class C : public B { }; int main(int argc, char * argv []) { return 0; }
Этот код дает следующую ошибку:
error: looser throw specifier for ‘virtual C::~C()’ error: overriding ‘virtual B::~B() throw ()’
при моем тестировании debian (gcc (Debian 4.6.0-10) 4.6.1 20110526 (предварительная версия)), но компилируется без ошибок в предыдущих версиях gcc (4.5 на снова моя система Debian).
Как спецификация исключения влияет на переопределение виртуального деструктора? В соответствии с этим ответом компилятор должен создать конструктор по умолчанию, соответствующий объявлению throw базового класса. Очевидно, что это не то, что происходит с новым gcc. Что изменилось, каково правильное поведение компилятора и есть ли какое-нибудь простое решение проблемы, кроме добавления вручную пустых деструкторов в производные классы (например, флаг компилятора).