Constexpr数学函数

时间:2013-06-27 16:00:30

标签: c++ c++11 constexpr cmath

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

3 个答案:

答案 0 :(得分:55)

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

答案 1 :(得分:9)

来自B. Stroustrup的“C ++编程语言(第4版)”,描述了C ++ 11:

  

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

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

答案 2 :(得分:4)

  

从这个页面中注意到c ++ 11中没有数学函数   似乎利用了constexpr,而我相信所有这些都可以   是。这让我有两个问题,一个是他们选择的原因   不要使函数constexpr。

这部分由 Sebastian Redl Adam Szaj 很好地解答,所以不会添加任何内容。

  

对于像sqrt这样的函数我可以编写自己的函数   constexpr,但像sin或cos这样的东西会比较棘手   远离它。

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