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

C++ C++;省略'noexcept'说明符与'noexcept(false)`,它们的确切含义是什么?,c++,c++11,noexcept,C++,C++11,Noexcept,如果我将一个函数标记为noexcept(false),或任何其他计算结果为false的表达式,这意味着什么?(1) 我是否向编译器保证函数可以抛出异常?,(2),或者我是否完全不保证函数是否可以抛出异常 最后,如果我省略了noexcept说明符,它相当于noexcept(false),或者只相当于上面所述的第(2)个含义?通过指定noexcept(true),您可以声明函数从不抛出异常。通过指定noexcept(false),或者不指定任何内容,您不会声称函数从不抛出异常 所以它基本上是你的语句

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


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

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

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

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

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

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


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

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

如果您将
noexcept(false)
视为与
noexcept(true)
相反,则可以回答所有问题。@Deduplicator更改了有关函数的措辞,但我似乎找不到对具有相同行为的构造函数的引用。是否可以提供段落编号?@Deduplicator仅当它不是用户提供的(即,在第一次声明时隐式声明或显式默认)。请参阅[dcl.fct.def.default]/p2,[except.spec]/14。您还错过了释放函数,默认情况下这些函数是
noexcept(true)