前書き
constexpr
定数式を必要とするコンテキストで何かを評価できることを実装に伝える方法として導入されませんでした。適合する実装は、C ++ 11より前にこれを証明することができました。
実装が証明できないものは、特定のコードの意図です。
- 開発者がこのエンティティで表現したいことは何ですか?
- たまたまコードが定数式で使用できるようにすべきでしょうか?
世界には何がないconstexpr
でしょうか?
ライブラリを開発していて、区間内のすべての整数の合計を計算できるようにしたいことに気付いたとします(0,N]
。
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
意図の欠如
コンパイラーは、渡された引数が変換中にわかっている場合、上記の関数が定数式で呼び出し可能であることを簡単に証明できます。しかし、これを意図として宣言していません-たまたまそうなのです。
さて、誰かがやって来て、あなたの関数を読み、コンパイラと同じ分析をします。「ああ、この関数は定数式で使える!」、次のコードを記述します。
T arr[f(10)]; // freakin' magic
最適化
あなたは、「素晴らしい」ライブラリ開発者として、f
呼び出されたときに結果をキャッシュすることを決定します。同じ値のセットを何度も計算したい人はいますか?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
結果
ばかげた最適化を導入することにより、たまたま定数式が必要とされるコンテキストにある関数のすべての使用法を壊しました。
関数がconstant-expressionで使用可能であると約束したことは決してありませんconstexpr
。そうでなければ、そのような約束を提供する方法はありません。
では、なぜ必要なのconstexpr
でしょうか?
constexprの主な用途は、意図を宣言することです。
エンティティがマークされていない場合constexpr
- 定数式で使用することは意図されていませんでした。そうである場合でも、コンパイラーに依存してこのようなコンテキストを診断します(意図を無視するため)。
constexpr
か?もしそうなら、私は使用法を見ることができます。