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版本(例如我Debian系统上的4.5)中编译时没有错误。根据{{link1:异常规范如何影响虚拟析构函数覆盖?}}的回答,编译器应该创建一个匹配基类throw声明的默认构造函数。显然,这不是新版gcc发生的情况。有什么改变,正确的编译器行为是什么,除了在派生类中手动添加空析构函数之外还有没有其他简单的解决方法(例如编译器标志)?