【发布时间】: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)