14

在浏览C++0x 工作草案的最后一次编辑时,我发现了很多

  • 删除关键字noexcept
  • 添加文本抛出:在同一个地方没有任何东西

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

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

这里的问题:

  • 是否有一般规则/模式,什么时候我们会发现noexceptvs. Throws: Std-Lib 中什么都没有?
  • 用户是否应该根据给定的规则得出特定的行为?即他们何时应该或不应该添加noexcept到自己的功能?
4

1 回答 1

16

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

采用的准则

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

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

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

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

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

于 2011-04-22T14:19:41.277 回答