0

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

... 对函数的潜在求值调用... 没有非抛出异常规范 ... 潜在求值 throw 表达式 ... 潜在求值 dynamic_cast ... 潜在求值typeid 表达式...

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

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

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

bool does_not_throw = noexcept(calculate());

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

4

1 回答 1

0

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

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

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

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

于 2013-08-20T04:53:22.867 回答