【问题标题】:noexcept(expression) - where expression is a noexcept function that actually throwsnoexcept(expression) - 其中 expression 是实际抛出的 noexcept 函数
【发布时间】:2013-08-22 00:13:19
【问题描述】:

查看 C++11 Spec (n3485) 第 5.3.7 节,注释 3 说 noexcept(expr) 的结果为假,如果:

...对函数的潜在评估调用...没有 非抛出异常规范...一个潜在的评估 throw-expression ... 一个潜在评估的 dynamic_cast ... a 潜在求值的 typeid 表达式...

“潜在评估”是否意味着它向下钻取(一点也不?一点点?)以确定其中一个条件是否会导致错误?

我发现(在测试代码中,而不是应用程序中)一个声称为 noexcept 但实际上抛出(即使在所有情况下)的函数仍将被视为 noexcept。是对规范有误解还是以下示例中的代码全错了?

double calculate(....) noexcept { throw "haha"; }  // using simpsons::nelson

bool does_not_throw = noexcept(calculate());

根据 Clang 3.3,这个测试表明 calculate() 不会抛出。

【问题讨论】:

  • noexcept 并不是说​​“这个函数中的任何东西或它调用的东西都不会抛出”,而是意味着“语言向你保证不会有任何异常逃脱这个函数”。如果必须,运行时将通过使用std::terminate 终止程序来强制执行该保证,而不是允许异常转义noexcept 函数。 (C++11 15.4/9)

标签: c++11 noexcept


【解决方案1】:

它所做的只是检查表达式的作用,以查看表达式的条款是否会引发异常。它不检查可能被调用的实际代码。如果表达式术语之一是未明确noexcept 的函数调用,则假定它能够引发异常。

或者,换句话说,它检查表达式中调用的所有函数是否都是noexcept。就是这样。

根据 Clang 3.3,这个测试表明 calculate() 不会抛出。

这是真的。因为calculate 被定义为noexcept,如果它试图发出异常,std::terminate 将被调用。因此,该函数不会发出任何异常。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2015-10-26
    • 1970-01-01
    • 2023-03-05
    • 2018-04-26
    • 2018-07-20
    • 2018-03-21
    • 2016-07-07
    相关资源
    最近更新 更多