18

如果我将函数标记为noexcept(false),或任何其他计算结果为假的表达式,这意味着什么?(1)我是否向编译器确​​保该函数可以抛出异常?,(2)或者我是否确保它是否可以抛出异常?

最后,如果我省略说明noexcept符,它等同于noexcept(false),还是仅等同于上述 (2)nd 含义?

4

2 回答 2

17

通过指定noexcept(true),您声称该函数从不抛出异常。通过指定noexcept(false)或不指定任何内容,您并不声称该函数从不抛出异常。

所以它基本上是你的语句(2),但请注意,对于编译器,这相当于你的语句(1)。如果编译器不能保证函数不会抛出,它必须假设它可以。

标准的相关位是 C++11 15.4/12:

没有异常规范或具有常量表达式产生的形式的异常规范的函数允许所有异常。如果异常规范的形式为,或常量表达式 产生,则异常规范是非 抛出的。具有非抛出异常规范的函数不允许任何异常。noexcept(constant-expression)falsethrow()noexceptnoexcept(constant-expression)true

该规则只有两个偏差。一种是析构函数——在析构函数上不放置异常规范会为析构函数提供与默认生成的异常规范相同的异常规范。也就是说,noexcept(true)当且仅当将从默认生成的析构函数直接调用的所有函数都是noexcept(true).

另一个是解除分配函数 ( operator delete)——没有明确异常规范的解除分配函数被视为noexcept(true)

于 2015-04-21T15:21:14.873 回答
9

省略说明noexcept符等同于noexcept(false)除了 destructors,省略说明符意味着让编译器从成员和基类中推导。

于 2015-04-21T15:25:20.790 回答