Constexprmath函数
所以从这个页面上注意到,在c ++ 11中没有一个math函数似乎使用了constexpr,而我相信它们都可以。 所以这给我留下了两个问题,一个是他们为什么不selectfunction。 一个像sqrt
这样的函数我可以写自己的constexpr,但是像sin或者cos这样的东西会更棘手,所以围绕它就会出现。
实际上,由于传统的老旧烦恼,几乎没有任何math函数可以被采用,因为它们都具有在各种错误条件(通常是域错误)上设置errno
的副作用。
从B. Stroustrup的“The C ++ Programming Language(4th Edition)”中描述C ++ 11:
“要在编译时进行评估,一个函数必须适当简单:一个constexpr函数必须由一个单一的return语句组成;没有循环,并且不允许局部variables,另外,constexpr函数可能没有副作用。
这意味着它必须是内联的,没有for,while和if语句和局部variables。 副作用也被禁止(例如:更改errno)。 另一个问题是,大多数math函数都是FPU指令,这些指令在纯C / C ++中没有表示(用汇编代码编写)。 这就是为什么非cmath函数声明为constexpr。
所以从这个页面上注意到,在c ++ 11中的math函数似乎没有使用constexpr,而我相信所有这些都可以。 所以这给我留下了两个问题,一个是他们为什么不selectfunction。
塞巴斯蒂安·雷德 ( Sebastian Redl)和亚当·萨杰 ( Adam Szaj)的回答非常好,所以不会加任何东西。
对于像sqrt这样的函数,我可以编写自己的constexpr,但是像sin或cos之类的东西会更棘手,所以围绕它就会变得更加棘手。
是的,你可以使用这些函数的泰勒级数展开来编写你自己的constexpr罪的版本。 看看这个超酷的github回购,它实现了几个math函数作为constexpr函数Morwenn / static_math