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

时间:2015-04-21 15:16:30

标签: c++ c++11 noexcept

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

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

2 个答案:

答案 0 :(得分:16)

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

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

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

  

没有异常规范异常规范的函数,其格式为noexcept(constant-expression),其中常量表达式 yield false允许所有异常。 异常规范是   非投掷,如果它的格式为throw()noexceptnoexcept(constant-expression),其中常量表达式   收益率true。具有非抛出异常规范的函数不允许任何异常。

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

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

答案 1 :(得分:8)

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