加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:44:03 所属栏目:百科 来源:网络整理
导读:以下似乎在我尝试过的几个编译器上编译: class A{public: virtual void foo() throw() = 0;};class B : public A{public: virtual void foo() noexcept override { }}; 似乎可以用一个更新的noexcept规范覆盖一个throw()函数.我也尝试了相反的(overpiding n
以下似乎在我尝试过的几个编译器上编译:
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]).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读