Seb*_*edl 57
实际上,由于旧的和恼人的遗产,几乎没有数学函数可以constexpr,因为它们都具有设置errno各种错误条件的副作用,通常是域错误.
来自B. Stroustrup的"The C++ Programming Language(4th Edition)",描述了C++ 11:
"要在编译时进行评估,函数必须非常简单:constexpr函数必须由单个return语句组成;不允许循环,也不允许局部变量.此外,constexpr函数可能没有副作用."
这意味着它必须是内联的,没有for,while和if语句和局部变量.副作用也是禁止的(例如:改变errno).另一个问题是大多数数学函数都是FPU指令,它们没有用纯c/c ++表示(它们是用汇编代码编写的).这就是为什么非cmath函数被声明为constexpr.
从这个页面注意到,c++11 中的数学函数似乎都没有使用 constexpr,而我相信它们都可以使用。所以这给我留下了两个问题,一个是他们为什么选择不将函数设为 constexpr。
Sebastian Redl和Adam Szaj很好地回答了这部分,因此不会添加任何内容。
对于像 sqrt 这样的函数,还有两个我可能可以编写自己的 constexpr,但是像 sin 或 cos 这样的东西会更棘手,所以就在它周围。
是的,您可以使用这些函数的泰勒级数展开来编写自己的 constexpr sin, cos 版本。看看这个超级酷的 github repo,它实现了几个数学函数作为 constexpr 函数Morwenn/static_math
| 归档时间: | 
 | 
| 查看次数: | 10850 次 | 
| 最近记录: |