関数定義のキーワードは、すべての引数と変数がコンパイル時に既知である場合、この関数がコンパイル時に実行される可能性があることconstexpr
をコンパイラに伝えます。ただし、そのような保証はありません。たとえば、一部の値が実行時にしかわからない場合、その関数は実行時に実行されます。
ただし、純粋または不純とは関係ありません。これらの用語は、出力が入力のみに依存することを意味し、入力パラメーターの同じ値で関数を何度呼び出しても、出力は毎回同じになるためです。コンパイル時または実行時に計算されるかどうかに関係なく。
例、
constexpr int add(int a, int b) { return a + b; } //pure!
const int a = 2, b = 3; //const
int c = 2, d = 3; //non-const
//we may read update c and d here!
const int v1 = add(2,3); //computed at compile-time
const int v2 = add(a,3); //computed at compile-time
const int v3 = add(2,b); //computed at compile-time
const int v4 = add(a,b); //computed at compile-time
const int v3 = add(c,3); //computed at runtime
const int v3 = add(c,b); //computed at runtime
const int v3 = add(a,d); //computed at runtime
const int v3 = add(c,d); //computed at runtime
ここでadd
は、コンパイル時または実行時に計算されるかどうかに関係なく、純粋な関数であることに注意してください。