在C ++ 17中,<cmath>函数是否必须为`noexcept`?

Ant*_*hov 5 c++ c++-standard-library noexcept c++17

在优化代码的某些部分时,我决定检查是否可以将某些方法声明为noexcept,这归结为我对的数学函数的不完全了解<cmath>

因此,我决定检查我使用的sin()asin()(例如)是否为noexcept

static_assert(noexcept(asin(1)));
static_assert(noexcept(sin(1)));
Run Code Online (Sandbox Code Playgroud)

它成功通过了,所以它们实际上是noexcept。我还查看了标准库实现中的相应定义:

template <class _A1>
inline _LIBCPP_INLINE_VISIBILITY
typename std::enable_if<std::is_integral<_A1>::value, double>::type
asin(_A1 __lcpp_x) _NOEXCEPT {return ::asin((double)__lcpp_x);}
Run Code Online (Sandbox Code Playgroud)

noexcept至少在我当前正在使用的实现中,这证实了它们的正确性。

但是,我无法确定这是否是标准要求的保证行为。因此,我想知道是否是必需的行为。如果不是这样,不要求他们成为的动机是noexcept什么?

通常的参考书cppreference.com没有列出noexcept这些功能(请参见比较)。与C的兼容性可能会引起一些混淆;但是,我找不到令人信服的逻辑,因为<cmath>显然使用C ++标头,而不是C兼容标头。

Bar*_*rry 6

[res.on.exception.handling] / 5状态:

一个实现可以通过添加一个非抛出异常规范来增强非虚函数的异常规范。

他们并不需要noexcept的,但实现,则允许将它们标记noexcept。您会看到,您的实现选择将其标记为此类,但是cppreference并未标记它们,因为它们并非必需如此。

如果不是,不要求他们无例外的动机是什么?

通常的Lakos规则适用-其中一些功能合同狭窄,因此假设实现可以选择退出合同等。