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)
, 除了析构函数 ,其中省略说明符意味着让编译器从成员和基类推导类.
如果我将函数标记为 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 yieldsfalse
allows all exceptions. An exception-specification is non-throwing if it is of the formthrow()
,noexcept
, ornoexcept(<i>constant-expression</i>)
where the constant-expression yieldstrue
. A function with a non-throwing exception-specification does not allow any exceptions.
该规则只有两个偏差。一种是析构函数——在析构函数上不放置任何异常规范,使析构函数具有与默认生成的异常规范相同的异常规范。也就是说,noexcept(true)
当且仅当从默认生成的析构函数中直接调用的所有函数都是 noexcept(true)
.
另一个是释放函数 (operator delete
)——没有显式异常规范的释放函数被视为 noexcept(true)
.
省略 noexcept
说明符等同于 noexcept(false)
, 除了析构函数 ,其中省略说明符意味着让编译器从成员和基类推导类.