C++ `constexpr`函数是否也应该是`noexcept`?
当我定义C++ `constexpr`函数是否也应该是`noexcept`?,c++,c++11,C++,C++11,当我定义constexpr函数时,我是否也应该将其声明为noexcept?我认为,在参数和用法满足编译时评估要求的情况下,潜在异常的意义是没有意义的。但在运行时对函数求值的情况下,它将正常应用 出于实际考虑,如果函数确实很简单,可能使用内置的算术或强制转换,因此我希望编译器能够始终内联函数并在函数之间进行优化,那么如果我不使用noexcept?不,您不应该这样做 “不能失败”和“可以在编译时进行评估”是正交问题。例如,您想要编写一个整数幂函数,但您想要将幂作为有符号(因为您认为无符号数只应用于非
constexpr
函数时,我是否也应该将其声明为noexcept
?我认为,在参数和用法满足编译时评估要求的情况下,潜在异常的意义是没有意义的。但在运行时对函数求值的情况下,它将正常应用
出于实际考虑,如果函数确实很简单,可能使用内置的算术或强制转换,因此我希望编译器能够始终内联函数并在函数之间进行优化,那么如果我不使用noexcept
?不,您不应该这样做
“不能失败”和“可以在编译时进行评估”是正交问题。例如,您想要编写一个整数幂函数,但您想要将幂作为有符号(因为您认为无符号数只应用于非常特殊的情况)。现在你说如果幂为负,你想抛出一个异常。在C++14中,您可以这样编写:
constexpr int ipow(int base, int power) {
if (power < 0) throw std::domain_error("negative power");
int result = 1;
for (int i = 0; i < power; ++i) result *= base;
return result;
}
constexpr int-ipow(int-base,int-power){
如果(功率<0)抛出std::domain_错误(“负功率”);
int结果=1;
对于(int i=0;i
这个函数显然不是例外,但对于非负参数,显然可以在编译时对其求值。如果在编译时需要结果的上下文中尝试使用它作为负参数,则会得到一个编译错误,这应该可以