noexcept(expression) - 其中expression是实际抛出的noexcept函数

时间:2013-08-20 03:49:56

标签: c++11 noexcept

查看C ++ 11规范(n3485)第5.3.7节,注3表示如果出现以下情况,则noexcept(expr)的结果为false:

  

...对函数的潜在评估调用...没有   非投掷异常规范......潜在评估   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()不会抛出。

1 个答案:

答案 0 :(得分:0)

所有它正在检查表达式的作用,以查看表达式的术语是否会引发异常。它不会检查可能被调用的实际代码。如果其中一个表达式术语是未明确noexcept的函数调用,则假定它能够抛出异常。

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

  

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

这是真的。由于calculate定义为noexcept,如果它尝试发出异常,则会调用std::terminate。因此,该函数不会发出异常。