Constexpr数学函数

问题描述 投票:55回答:3

所以从这个page注意到c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以。所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr。对于像sqrt这样的函数,我可以编写自己的constexpr,但是像sin或cos这样的东西会比较复杂,所以有办法绕过它。

c++ c++11 constexpr cmath
3个回答
57
投票

实际上,由于旧的和恼人的遗产,几乎没有数学函数可以是constexpr,因为它们都具有在各种错误条件下设置errno的副作用,通常是域错误。


9
投票

来自B. Stroustrup的“The C ++ Programming Language(4th Edition)”,描述了C ++ 11:

“要在编译时进行评估,函数必须非常简单:constexpr函数必须由单个return语句组成;不允许循环,也不允许局部变量。此外,constexpr函数可能没有副作用。”

这意味着它必须是内联的,没有for,while和if语句和局部变量。副作用也是禁止的(例如:改变errno)。另一个问题是大多数数学函数都是FPU指令,它们没有用纯c / c ++表示(它们是用汇编代码编写的)。这就是为什么非cmath函数被声明为constexpr。


4
投票

从这个页面中可以看出,c ++ 11中的数学函数似乎都没有使用constexpr,而我相信所有这些函数都可以。所以这给我留下两个问题,一个是他们为什么选择不使函数constexpr。

Sebastian Redl和Adam Szaj很好地回答了这一部分,因此不会添加任何内容。

对于像sqrt这样的函数,有两个我可以编写自己的constexpr,但像sin或cos这样的东西会比较棘手,所以它就在那里。

是的,您可以使用这些函数的泰勒系列扩展来编写自己的constexpr sin,cos版本。看看这个超酷的github repo,它实现了几个数学函数作为constexpr函数Morwenn/static_math

© www.soinside.com 2019 - 2024. All rights reserved.