所以从这个页面注意到,c++11 中的数学函数似乎都没有使用 constexpr,而我相信它们都可以。所以这给我留下了两个问题,一个是为什么他们选择不制作函数 constexpr。对于像我这样的函数,sqrt
我可能会编写自己的 constexpr,但是像 sin 或 cos 这样的函数会更棘手,所以有没有办法绕过它。
3 回答
实际上,由于旧的和令人讨厌的遗留问题,几乎没有一个数学函数可以是,因为它们都有设置各种错误条件constexpr
的副作用,通常是域错误。errno
摘自 B. Stroustrup 的“The C++ Programming Language (4th Edition)”,描述了 C++11:
“要在编译时进行评估,函数必须适当简单:constexpr 函数必须由单个返回语句组成;不允许循环,也不允许局部变量。此外,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