C ++标准库实现是否允许加强noexcept规范?

时间:2016-06-27 10:05:28

标签: c++ language-lawyer c++-standard-library noexcept

根据C ++标准,C ++标准库的实现是否允许加强noexcept方法的规范以及标准定义的C ++标准库的其他功能?

例如,如果C ++标准将某个函数std::f指定为void f();,则标准库实现是否允许将其实现为void f() noexcept;

1 个答案:

答案 0 :(得分:9)

标准说是:

  

§17.6.5.12.1异常处理的限制[res.on.exception.handling]

     
      
  1. C ++标准库中定义的任何函数都可以通过抛出抛出:段落中描述的类型的异常来报告失败。实现可以通过添加非投掷 noexcept-specification来强化非虚函数的异常规范。
  2.         

    [...]

         
        
    1. C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像具有非抛出异常规范。任何其他   除非另有说明,否则在C ++标准库中定义的没有异常规范的函数可能抛出实现定义的异常。实施可以加强这一点   隐式异常规范,通过添加一个明确的。
    2.   

(逗号4似乎只是允许明确异常规范,并警告缺少显式异常规范意味着允许实现抛出任何东西)。

说实话,我不明白为什么允许这样做而且添加constexpr不是(第17.6.5.6节)。它们看起来像是同一枚牌的两面 - 通过使用类型特征和SFINAE,你可以拥有代码,根据你使用的标准库实现显示不同的行为(如果它将某些函数标记为noexcept / {{1或者,如果没有),并且首先违背了制定标准的目的......