"noexcept"和"Throws: nothing"的区别

14

在查看最新的C++0x工作草案时,我发现很多内容:

  • 关键词noexcept被删除了
  • 在同一位置添加文本Throws:nothing

反之亦然。以下是一些例子:

  • noexcept替换为Throws:nothing20.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;

问题如下:

  • 在Std-Lib中,是否存在一个通用规则/模式来区分noexceptThrows:nothing
  • 用户是否应该根据此规则推导出特定行为?即他们何时应该或不应该在自己的函数中添加noexcept
1个回答

16

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

采用的准则

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

  • 每个具有广泛约定的库函数,LWG认为不能抛出异常,应标记为无条件noexcept。

  • 如果库swap函数、移动构造函数或移动赋值操作符是有条件的(即可以通过应用noexcept运算符来证明不会引发异常),则应将其标记为有条件noexcept。没有其他函数应该使用条件noexcept规范。

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

我不认为这些准则一定是针对更广泛的受众,这主要是承认我们确实需要考虑向后兼容性问题。如果我们做错了,下一个标准中增加noexcept比删除更容易。因此,我们尝试了一种既保守又系统的noexcept应用。


我理解了,这是一个棘手的情况。我认为我会在 WG21 文件中多读一些内容,为即将到来的问题做好准备,比如“我应该什么时候在自己的函数中添加 noexcept ?”N3279 是一个很好的入门点。你还有其他建议吗?例如,目前我建议用户代码中的 swap 应该是 noexcept 的,并计划遵循关于move-assign等的文献。用户是否需要标记为 noexcept?或者隐含的假设足够了吗?如果用户这样做,我们能指望编译器(某天)从中获益吗? - towi
我目前没有可以实现noexcept的编译器。因此,我对这个问题没有个人建议(在我看来,实验是很重要的)。你可以在这里找到所有的WG21论文:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ - Howard Hinnant
谢谢,我会仔细遵循编译器的注释。是的,我已经深入研究了那些论文 :-) - towi
2011年6月的Overload Journal(http://accu.org/var/uploads/journals/overload103.pdf)有一篇优秀的文章详细解释了noexcept的语义。 - Sumant

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