如果我将函数标记为noexcept(false)
,或任何其他评估为false的表达式,它意味着什么? (1)我是否向编译器确保该函数可以抛出异常?,(2)或者我是否确定它是否可以抛出异常?
最后,如果省略noexcept
说明符,它等同于noexcept(false)
,或仅等同于上述(2)nd含义?
答案 0 :(得分:16)
通过指定noexcept(true)
,您声明该函数永远不会抛出异常。通过指定noexcept(false)
或不指定任何内容,您不会声称该函数永远不会抛出异常。
所以它基本上是你的陈述(2),但请注意,对于编译器来说,这相当于你的陈述(1)。如果编译器不确定该函数不会抛出,则必须假设它可以。
标准的相关位是C ++ 11 15.4 / 12:
没有异常规范或异常规范的函数,其格式为
noexcept(constant-expression)
,其中常量表达式 yieldfalse
允许所有异常。 异常规范是 非投掷,如果它的格式为throw()
,noexcept
或noexcept(constant-expression)
,其中常量表达式 收益率true
。具有非抛出异常规范的函数不允许任何异常。
该规则只有两个偏差。一个是析构函数 - 在析构函数上没有异常规范,为析构函数提供了与默认生成的异常规范相同的异常规范。也就是说,noexcept(true)
当且仅当从默认生成的析构函数直接调用的所有函数都是noexcept(true)
。
另一个是释放函数(operator delete
) - 没有显式异常规范的释放函数被视为noexcept(true)
。
答案 1 :(得分:8)
省略noexcept
说明符等同于noexcept(false)
,除了析构函数,省略说明符意味着让编译器从成员和基类中推断出来。