标记为noexcept的函数内部是否有例外?

San*_*lin 3 c++ exception noexcept c++11

假设我有一个标记为的函数,noexcept但里面有一行代码可以抛出.那行代码将在try块中,异常将被捕获.这会导致什么吗?

void MyFunc() noexcept
{
    try {
        throw std::exception("...");
    } catch (const std::exception & e) {
        // I'll deal with it here...
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

从内到外搜索异常处理程序,只要找不到任何处理异常的内容,就会搜索一个级别更低的级别.

15.3处理异常[except.handle]

4尝试块的处理程序按外观顺序进行尝试.[...]

[...]

6如果在try块的处理程序中找不到匹配项,则在同一线程的动态环绕try块中继续搜索匹配处理程序.

15.4例外规范[except.spec]

9每当抛出异常并且搜索处理程序(15.3)遇到函数的最外面的块时,异常规范不允许异常,那么,

[... std::unexpected()或被std::terminate()称为.]

唯一noexcept(true)有效的可能是从函数内部抛出异常,并且不存在匹配的处理程序.没有为具有匹配处理程序的异常指定特殊效果,因此必须与noexcept(false)函数中的相同.


Bri*_*ian 5

是的,这是完全合法的,只要异常不会泄漏出函数。

实现不应仅仅因为表达式在执行时抛出或可能抛出包含函数不允许的异常而拒绝表达式。

[C++11 中的.spec/11 除外]

  • 您的回答是正确的,但您的引用适用于 `void MyFunc() noexcept { throw std::exception("..."); }`(没有`try`/`catch`),并且仅仅声明编译器不能拒绝它,它不包括在运行时如何处理异常。 (4认同)