64

所以从这个页面注意到,c++11 中的数学函数似乎都没有使用 constexpr,而我相信它们都可以。所以这给我留下了两个问题,一个是为什么他们选择不制作函数 constexpr。对于像我这样的函数,sqrt我可能会编写自己的 constexpr,但是像 sin 或 cos 这样的函数会更棘手,所以有没有办法绕过它。

4

3 回答 3

66

实际上,由于旧的和令人讨厌的遗留问题,几乎没有一个数学函数可以是,因为它们都有设置各种错误条件constexpr的副作用,通常是域错误。errno

于 2013-06-27T16:05:48.027 回答
9

摘自 B. Stroustrup 的“The C++ Programming Language (4th Edition)”,描述了 C++11:

“要在编译时进行评估,函数必须适当简单:constexpr 函数必须由单个返回语句组成;不允许循环,也不允许局部变量。此外,constexpr 函数可能没有副作用。”

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

于 2014-09-10T10:42:38.733 回答
5

所以从这个页面注意到,c++11 中的数学函数似乎都没有使用 constexpr,而我相信它们都可以。所以这给我留下了两个问题,一个是为什么他们选择不制作函数 constexpr。

Sebastian RedlAdam Szaj很好地回答了这部分内容,因此不会添加任何内容。

对于像 sqrt 这样的函数,我可能会编写自己的 constexpr,但是像 sin 或 cos 这样的函数会更棘手,所以它周围没有。

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

于 2017-10-27T16:49:03.443 回答