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

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

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

最后,如果我省略了noexcept说明符,它相当于noexcept(false),或者只相当于上面所说的第(2)个意思?

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

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

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

A function with no exception-specification or with an exception-specification of the form noexcept(<i>constant-expression</i>) where the constant-expression yields false allows all exceptions. An exception-specification is non-throwing if it is of the form throw(), noexcept, or noexcept(<i>constant-expression</i>) where the constant-expression yields true. A function with a non-throwing exception-specification does not allow any exceptions.

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

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

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