【发布时间】:2011-09-26 05:02:34
【问题描述】:
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 再次)。
How does an exception specification affect virtual destructor overriding? 根据该答案,编译器应该创建一个与基类的 throw 声明匹配的默认构造函数。显然这不是在新 gcc 上发生的事情。发生了什么变化,正确的编译器行为是什么,除了在派生类中手动添加空析构函数(例如编译器标志)之外,是否有一些简单的解决方案。
【问题讨论】:
-
那是实际的代码吗?如果您跳过了成员声明,那可能会改变结果。另外,您是否指定了 C++11 支持?规则在析构函数方面略有改变,虽然代码应该仍然没问题,但那里可能有错误。
-
不,这不是实际代码。我能说出来,因为它至少有一个语法错误。 @Yordan,请在提问时发布实际的、可编译的代码。有关如何执行此操作以及为什么重要的详细信息,请参阅sscce.org。
-
@Rob - O.o 你在开玩笑吧..?这不是一些复杂而冗长的源代码的问题,这些东西很重要。缺少两个明显的分号,这不会改变问题、信息、环境等任何东西。
-
@Kiril:我 100% 同意 Rob。如果一个 OP 在发布的代码中引入了新的错误,我们怎么能期望在原始代码中找到错误呢?
-
在这种情况下,一个完整的、可编译的示例是双重重要的,因为如果他将一个成员添加到他为简单起见而删除的派生类,无论错误是他的错还是编译器的错误都可以改变。就目前而言,该错误是编译器错误。
标签: c++ linux exception gcc throw