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 (prerelease) )上,但在以前的 gcc 版本上编译没有错误(我的 debian 系统上的 4.5 再次)。
异常规范如何影响虚拟析构函数覆盖? 根据该答案,编译器应该创建一个与基类的 throw 声明匹配的默认构造函数。显然这不是在新 gcc 上发生的事情。发生了什么变化,正确的编译器行为是什么,除了在派生类中手动添加空析构函数(例如编译器标志)之外,是否有一些简单的解决方案。