由于某种原因,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”的建议。一般来说,这是可能的,因为它们是纯函数。实现可以使用编译器内建函数在其库中实现它们,所以不需要“真正”的实现。但是,如果没有这个提案,你不能指望这些特性有 constexpr
的实现。
那里的函数并不简单。实际上,它们相当复杂,无法作为单个返回语句实现。三角、对数和双曲线函数相当复杂,难以作为constexpr函数实现。
the function body must be either deleted or defaulted or contain only the following:
....
exactly one return statement that contains only literal values, constexpr variables and functions.
?:
运算符和递归,你就可以实现几乎所有不需要运行时知识(内存操作)的功能。 - Draxconstexpr float sinh(float x) {return 0.5 * (exp(x)-exp(-x));}
现在你只需要一个 constexpr
exp :D - Draxstd
内的函数必须是实际的函数。 - K-ballo<cmath>
,源自于C语言,并且是在constexpr
甚至没有想法的时候编写的。constexpr
,你需要以constexpr
的方式重写整个库。
constexpr
链接。) - Neil G