C++省略了"noexcept"说明符与"noexception(false)"

C++ omitting `noexcept` specifier versus `noexcept(false)`, what is their precise meaning?

本文关键字:quot noexception false 说明符 C++ noexcept      更新时间:2023-10-16

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

最后,如果我省略了noexcept说明符,它等同于noexcept(false),或者只等同于上面所说的第(2)个含义?

通过指定noexcept(true),您可以声明函数从不抛出异常。通过指定noexcept(false),或者不指定任何内容,就不会声称函数从不抛出异常。

因此,它基本上是您的语句(2),但请注意,对于编译器来说,这相当于您的声明(1)。如果编译器不能保证函数不会抛出,那么它必须假设它可以抛出。

该标准的相关位是C++115.4/12:

一个没有异常规范或有例外规范noexcept(constant-expression)形式的函数,其中常量表达式产生false允许所有异常。异常规范非抛出,如果其形式为throw()noexceptnoexcept(constant-expression),其中常量表达式产生true。具有非抛出异常规范的函数不允许任何异常。

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

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

除了析构函数之外,省略noexcept说明符等效于noexcept(false),其中省略说明符意味着让编译器从成员和基类中推导。