当我定义constexpr
函数时,我是否还应将其声明为noexcept
?我想在参数和用法满足编译时评估要求的情况下,潜在异常的含义没有实际意义。但是,对于在运行时评估函数的情况,它将正常应用。
作为一个实际问题,如果函数确实是 simple ,可能使用内置算术或强制转换,这样我希望编译器可以始终内联函数并在其中进行优化,如果我离开noexcept
?
答案 0 :(得分:7)
不,你不应该。
"不能失败"和#34;可以在编译时评估"是正交问题。例如,您想要写一个整数幂函数,但是您希望将幂作为有符号函数(因为您认为无符号数只应用于非常特殊的情况)。现在你说如果功率为负,你想抛出异常。在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;
}
这个函数显然不是noexcept,但是对于非负参数,你显然可以在编译时对它进行评估。如果在编译时需要结果的上下文中尝试使用负参数,则会出现编译错误,这应该没问题。