微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C标准是什么意思用overexcept来覆盖一个throw()函数?

以下似乎在我尝试过的几个编译器上编译:
class A
{
public:
    virtual void foo() throw() = 0;
};

class B : public A
{
public:
    virtual void foo() noexcept override { }
};

似乎可以用一个更新的noexcept规范覆盖一个throw()函数.我也尝试了相反的(overpiding noexcept with throw()),它似乎工作.这是为什么?这是未定义的行为还是允许的?

请注意,代码生成受到noexcept vs throw()的影响.它们也没有等效的行为,因为noexcept调用与throw()不同的终止函数.一个理想的答案将会提到行为上的差异,为什么他们这样做或不重要.

解决方法

你甚至可以做到这一点,而不是压倒一切:
void f() throw();
void f() noexcept { throw 1; }

[except.spec]/9清楚地表明,这是定义中的规范来控制发生什么:

Whenever an exception of type E is thrown and the search for a handler
([except.handle]) encounters the outermost block of a function with an
exception specification that does not allow E,then,

  • if the function deFinition has a dynamic-exception-specification,the
    function std::unexpected() is called ([except.unexpected]),

  • otherwise,the function std::terminate() is called
    ([except.terminate]).

这不是一个问题,因为这样做的特殊处理发生在被叫方,而不是来电者;所有调用者需要知道的是,没有例外会永远离开这个功能.

原文地址:https://www.jb51.cc/c/113913.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐