C言語や C++ において、定数式(constant expression) に関連する機能を示すために用いられるキーワードです。
C++ の C++11規格で最初に導入され、10年以上遅れて、C言語でも C23規格で導入されています。
定数式とは、コンパイル時に評価を行って、値を得ることができる式のことです。プログラムの実行中に計算を行う必要がなくなるため、プログラムの実行効率の向上に役立ちます。
C言語では C23規格で導入されています。先行して導入されていた C++ の仕様を参考にしたものですが、C23 では変数に対する使用にのみ対応しています。
constexpr は、static や extern などとともに記憶域クラス指定子に分類されます。
constexpr を変数の宣言に付加することで、その変数の値がコンパイル時に決定されます。また、実行時に書き換わることもありません(暗黙的に const)。この変数はコンパイル時定数として利用することができ、定数式とみなせます。そのため、配列の要素数の指定や、列挙定数の値など、コンパイル時の初期化が必要な文脈で使用できます。
constexpr int size = 10;
char s[size]; // OK。C言語では size が const であってもエラーだった
enum {
= size, // OK
A };
C++ では C++11規格で最初に導入されました。
C++ における constexpr は変数のほか、関数、コンストラクタなどにも付加できます。constexpr を付加して宣言された変数は constexpr変数、関数の場合は constexpr関数、コンストラクタの場合は constexprコンストラクタと呼ばれます。
導入当初(C++11)には多くの制限があり、たとえば constexpr関数の本体は単一の return文に限られており、戻り値を void にできず、if文の代わりに条件演算子を、ループ文の代わりに再帰呼び出しを駆使するかたちで記述しなければなりませんでした。
その後の規格で順次緩和され、C++14 では関数内で複数の文やローカル変数を使えるようになり、より複雑な計算を、通常の関数とほとんど変わらない方法で記述できるようになりました。
constexpr int square(int x) { return x * x; }
constexpr int v = square(3); // コンパイル時に評価される
// C++14 以降ではより複雑な関数も constexpr にできる
constexpr int factorial(int n) {
int r = 1;
for (int i = 2; i <= n; ++i) r *= i;
return r;
}
constexpr int f5 = factorial(5); // コンパイル時に評価される
constexpr関数は、コンパイル時に評価されることが期待されますが、実行時にも通常の関数として呼び出すことができます。C++20 では、コンパイル時に評価することを要求する consteval という新しいキーワードも導入されています(即時関数)。
詳細は、新C++編「constexpr」を参照してください。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |