查看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()不会抛出。
答案 0 :(得分:0)
所有它正在检查表达式的作用,以查看表达式的术语是否会引发异常。它不会检查可能被调用的实际代码。如果其中一个表达式术语是未明确noexcept
的函数调用,则假定它能够抛出异常。
或者,换句话说,它会检查表达式中调用的所有函数是否为noexcept
。就是这样。
根据Clang 3.3,该测试表明calculate()不会抛出。
这是真的。由于calculate
定义为noexcept
,如果它尝试发出异常,则会调用std::terminate
。因此,该函数不会发出异常。