C++省略`noexcept`说明符与`noexcept(false)`,它们的确切含义是什么?

Per*_*-lk 16 c++ noexcept c++11

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

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

Rei*_*ica 16

通过指定noexcept(true),您声称该函数永远不会抛出异常.通过指定noexcept(false)或不指定任何内容,您不会声称该函数永远不会抛出异常.

所以它基本上是你的声明(2),但请注意,对于编译器来说,这相当于你的语句(1).如果编译器不确定函数不会抛出,它必须假设它可以.

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

无A功能异常规范或与异常规范的形式的,其中恒定表达产率允许的所有异常.一个异常规范不抛出,如果它的形式为,,或其中所述恒定表达 产率.具有非抛出异常规范的函数不允许任何异常.noexcept(constant-expression)falsethrow()noexceptnoexcept(constant-expression)true

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

另一个是释放函数(operator delete) - 没有显式异常规范的解除分配函数被视为noexcept(true).


Seb*_*edl 8

省略noexcept说明符相当于noexcept(false),除了析构函数,在这里省略说明符装置使来自会员和基类编译器推导.