出于某种原因,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”?
答案 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
实现。