有条件地指定 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
使用条件,但该条件必须是常量表达式。它不能依赖于传递给函数的参数值,因为它们只有在调用函数时才知道。
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>
是一个可能抛出的函数。
假设我声明了这样的函数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
使用条件,但该条件必须是常量表达式。它不能依赖于传递给函数的参数值,因为它们只有在调用函数时才知道。
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>
是一个可能抛出的函数。