有条件地指定 noexcept 函数

Specifying noexcept function conditionally

假设我声明了这样的函数noexcept:

int pow(int base, int exp) noexcept
{
    return (exp == 0 ? 1 : base * pow(base, exp - 1));
}

根据我对 C++ 的了解很少但慢慢增长的知识,当我确定该函数不会引发异常时,我可以 noexcept。我还了解到它可以在某个值范围内,可以说当 exp 小于 10 且 base 小于 8 时我考虑我的函数 noexcept (仅作为示例).在这样的取值范围内如何声明这个函数是noexcept?或者我最多只能给其他程序员留下评论,说它应该在某个特定范围内?

您可以为 noexcept 使用条件,但该条件必须是常量表达式。它不能依赖于传递给函数的参数值,因为它们只有在调用函数时才知道。

来自cppreference/noexcept

Every function in C++ is either non-throwing or potentially throwing

不能两者兼有,也不能介于两者之间。在您的示例中,我们可以使 base 成为模板参数:

template <int base>
int pow(int exp) noexcept( base < 10)
{
    return (exp == 0 ? 1 : base * pow<base>(exp - 1));
}

现在 pow<5> 是一个不抛出的函数,而 pow<10> 是一个可能抛出的函数。