为什么标准库常见的数学函数不是“常量表达式”?

时间:2014-01-23 08:57:54

标签: c++11 constexpr cmath

出于某种原因,clang ++(但不是g ++)抱怨:

constexpr double invdecayf1m(double x) {
  return -log1p(-x);
}
告诉我

non-constexpr function 'log1p' cannot be used in a constant expression
  return -log1p(-x);

为什么<cmath>中宣布的common mathematical functions未声明为constexpr functions”

3 个答案:

答案 0 :(得分:1)

名称<cmath>中隐含的数学库来自c,并且在constexpr甚至不是一个想法时编写。

为了使大多数函数为constexpr,您必须以constexpr方式重写整个库。

答案 1 :(得分:1)

答案在您发布的链接中:

 the function body must be either deleted or defaulted or contain only
 the following:   
     

....
          只包含一个只包含文字值,constexpr变量和函数的return语句。

那里的功能并不那么简单。事实上,它们非常复杂,不可能作为单个return语句实现。三角函数,对数函数和双曲函数非常复杂,并且难以作为constexpr函数实现。

答案 2 :(得分:1)

我认为唯一的原因是没有人写过让他们成为constexpr的提案。一般来说它是可能的,因为它们是纯函数。实现可以使用编译器内在函数为它们实现它们,因此不需要“真正的”实现。但是,如果没有提案,您就不能指望这些功能的constexpr实现。