C++中省略`noexcept`和`noexcept(false)`的区别是什么?它们的确切含义是什么?

18
如果我将函数标记为noexcept(false)或任何其他计算结果为false的表达式,这意味着什么?(1)我是否向编译器保证该函数可以抛出异常?(2)还是我对它是否能够抛出异常没有任何保证?
最后,如果我省略noexcept说明符,它是否等同于noexcept(false),还是仅等同于上述(2)的含义?

如果你认为 noexcept(false)noexcept(true) 的相反,那么 这个参考链接 就能解决所有问题。 - chris
2个回答

17
通过指定 noexcept(true),你声称该函数永远不会抛出异常。通过指定 noexcept(false) 或不指定任何内容,你并没有声称该函数永远不会抛出异常。
所以基本上这是你的第二种说法,但请注意,对于编译器来说,这与你的第一种说法是等价的。如果编译器不能确保该函数不会抛出异常,它必须假设它可以。
标准的相关部分是C++11 15.4 / 12:
  

没有异常说明符或形式为noexcept(constant-expression),其中constant-expression产生false的函数允许所有异常。如果它是throw()noexceptnoexcept(constant-expression)的形式,则非抛出异常说明符如果constant-expression产生true。具有非抛出异常说明符的函数不允许任何异常。

只有两个例外。一个是析构函数——在析构函数上没有放置异常说明符,将给予析构函数与默认生成的析构函数相同的异常说明符。也就是说,仅当从默认生成的析构函数直接调用的所有函数都是noexcept(true)时,才会是noexcept(true)
另一个是解分配函数(operator delete ) - 没有显式异常说明符的解分配函数被视为noexcept(true)

1
@Deduplicator 更改了有关函数的措辞,但似乎找不到构造函数表现相同的参考。您能提供段落编号吗? - Angew is no longer proud of SO
1
@Deduplicator 只有在不是由用户提供的情况下才能这样做(即,在第一次声明时隐式声明或显式默认)。请参见[dcl.fct.def.default]/p2,[except.spec]/14。 - T.C.
你还错过了释放内存的函数,它们默认情况下是 noexcept(true) - T.C.

9
忽略noexcept说明符相当于noexcept(false),除了在析构函数中,省略说明符意味着让编译器从成员和基类中推断。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接