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