根据C ++标准,C ++标准库的实现是否允许加强noexcept
方法的规范以及标准定义的C ++标准库的其他功能?
例如,如果C ++标准将某个函数std::f
指定为void f();
,则标准库实现是否允许将其实现为void f() noexcept;
?
答案 0 :(得分:9)
标准说是:
§17.6.5.12.1异常处理的限制[res.on.exception.handling]
- C ++标准库中定义的任何函数都可以通过抛出抛出:段落中描述的类型的异常来报告失败。实现可以通过添加非投掷 noexcept-specification来强化非虚函数的异常规范。
醇>[...]
- C ++标准库中定义的析构函数操作不应抛出异常。 C ++标准库中的每个析构函数都应该表现得好像具有非抛出异常规范。任何其他 除非另有说明,否则在C ++标准库中定义的没有异常规范的函数可能抛出实现定义的异常。实施可以加强这一点 隐式异常规范,通过添加一个明确的。
醇>
(逗号4似乎只是允许明确异常规范,并警告缺少显式异常规范意味着允许实现抛出任何东西)。
说实话,我不明白为什么允许这样做而且添加constexpr
不是(第17.6.5.6节)。它们看起来像是同一枚牌的两面 - 通过使用类型特征和SFINAE,你可以拥有代码,根据你使用的标准库实现显示不同的行为(如果它将某些函数标记为noexcept
/ {{1或者,如果没有),并且首先违背了制定标准的目的......