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
functionstd::unexpected()
is called ([except.unexpected]),otherwise,the function
std::terminate()
is called
([except.terminate]).
原文地址:https://www.jb51.cc/c/113913.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。