【发布时间】:2017-03-06 16:39:40
【问题描述】:
以下似乎可以在我尝试过的几个编译器上编译:
class A
{
public:
virtual void foo() throw() = 0;
};
class B : public A
{
public:
virtual void foo() noexcept override { }
};
似乎可以使用更新的 noexcept 规范覆盖 throw() 函数。我也尝试了相反的方法(用 throw() 覆盖 noexcept),它似乎有效。这是为什么?这是未定义的行为还是允许的?
请注意,代码生成受 noexcept 与 throw() 的影响。它们也没有等效的行为,因为 noexcept 调用了与 throw() 不同的终止函数。一个理想的答案将指出行为差异以及在这种情况下它们为什么重要或不重要。
【问题讨论】:
-
除非我遗漏了什么,否则stackoverflow.com/questions/5295134/… 似乎回答了这个问题。
-
请参阅下面关于 Biagio 答案的主题。 throw() 和 noexcept 在行为上的细微差别使得这比仅仅限制抛出的异常更加棘手。