64

このページから、c++ 11 の数学関数のどれも constexpr を使用していないように見えることに気付きましたが、私はそれらすべてが使用できると信じています。1 つは、関数を constexpr にしないことを選択した理由です。そして、sqrtおそらく独自のconstexprを書くことができるような関数の2つですが、sinやcosのようなものはよりトリッキーになるので、それを回避する方法はありますか.

4

3 に答える 3

9

「C++ プログラミング言語 (第 4 版)」より、B. Stroustrup 著、C++11 について説明:

「コンパイル時に評価されるためには、関数は適切に単純である必要があります。constexpr 関数は単一の return ステートメントで構成されている必要があります。ループやローカル変数は許可されていません。また、constexpr 関数には副作用がない場合があります。」

つまり、for、while、if ステートメントとローカル変数を使用せずに、インラインである必要があります。副作用も禁止されています (例: errno の変更)。もう 1 つの問題は、ほとんどの数学関数が純粋な C/C++ で表現されていない FPU 命令であることです (それらはアセンブラー コードで記述されています)。そのため、cmath 関数以外は constexpr として宣言されています。

于 2014-09-10T10:42:38.733 に答える