“noexcept”vs“投掷:什么都没有”

时间:2011-04-22 14:10:34

标签: c++ exception c++11 noexcept

在完成 C ++ 0x工作草案的最后编辑时,我发现了很多

  • 删除关键字noexcept
  • 在同一个地方添加文字投掷:没有

反之亦然。只是一些例子:

  • noexcept替换为抛出:无 20.6.4指针安全[util.dynamic.safety] template<class T> T*undeclare_reachable(T*p);
  • 添加noexcept 20.6.3.2。指针特征成员函数[pointer.traits.functions] static pointer pointer_trait<T*>::pointer_to(...) noexcept;

问题在这里:

  • 当我们在Std-Lib中找到noexcept投掷:没有时,是否存在一般规则/模式?
  • 用户是否应根据给定规则获取特定行为?即当他们应该或不应该将noexcept添加到他们自己的函数中时?

1 个答案:

答案 0 :(得分:16)

在马德里,我们受到N3279的强烈影响,其中包括以下指南:

采纳指南

  • 没有库析构函数应该抛出。他们应使用隐式提供的(非抛出)异常规范。

  • LWG同意不能抛出的每个具有广泛合同的函数库函数都应该被标记为无条件noexcept。

  • 如果库交换函数,移动构造函数或移动赋值运算符是条件宽的(即可以通过应用noexcept运算符证明不能抛出),那么它应该被标记为有条件的noexcept。没有其他函数应该使用条件noexcept规范。

  • 为与“C”代码(例如原子设施)兼容而设计的库函数可以标记为无条件noexcept。

我不会将这些指南解释为必须针对更广泛的受众群体。这主要是承认我们确实有添加noexcept的向后兼容性问题。如果我们弄错了,noexcept比在下一个标准中删除更容易。因此,我们尝试应用noexcept,既保守又系统。