为什么标准库不"constant expressions"常见的数学函数?

Why aren't standard library common mathematical functions "constant expressions"?

本文关键字:函数 常见 expressions 标准 constant 为什么      更新时间:2023-10-16

出于某种原因,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>中没有声明的常见数学函数都声明为" constexpr函数"?

我认为唯一的原因是没有人写一份提议,以使其成为Constexpr。通常,由于它们是纯粹的函数,这是可能的。实现可以使用编译器内在来为Theier Lib实施它们,因此不需要"真正的"实现。但是如果没有建议,您将无法指望constexpr这些功能的实现。

名称 <cmath>中暗示的数学库来自C,当constexpr甚至不是一个想法时写的。

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

答案在您发布的链接中:

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

....
恰好一个仅包含文字值,ConstexPR变量和函数的返回语句。

那里的功能并不简单。实际上,它们非常复杂,并且不可能作为单个返回语句实施。三角,对数和双曲线功能非常复杂,很难作为constexpr函数实现。