查看 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() 不会抛出。