`constexpr`函数也应该是'noexcept`吗?

时间:2016-02-29 09:32:45

标签: c++ c++11

当我定义constexpr函数时,我是否还应将其声明为noexcept?我想在参数和用法满足编译时评估要求的情况下,潜在异常的含义没有实际意义。但是,对于在运行时评估函数的情况,它将正常应用。

作为一个实际问题,如果函数确实是 simple ,可能使用内置算术或强制转换,这样我希望编译器可以始终内联函数并在其中进行优化,如果我离开noexcept

,生成的代码的效率是否重要?

1 个答案:

答案 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,但是对于非负参数,你显然可以在编译时对它进行评估。如果在编译时需要结果的上下文中尝试使用负参数,则会出现编译错误,这应该没问题。