constexpr とは
constexpr は C++11 で導入された指定子のキーワードです。
変数を明示的にコンパイル時定数として宣言したり、
実行時にもコンパイル時にも呼出しできる関数を宣言したりできます。
また、C++03 の定数値のように整数型や列挙型だけでなく、浮動小数点型やポインタや配列、
更に特定の条件を満たすユーザ定義クラスもコンパイル時定数として扱えるようになりました。
これらコンパイル時定数にできる型は「リテラル型」というカテゴリに分類されます。
これによって、これまで TMP では諸々の制限によって難しかった処理の多くが、
コンパイル時に処理可能になりました。
- constexpr 宣言された変数は、コンパイル時定数になる
constexpr int zero = 0; // constexpr 変数 using zero_t = std::integral_constant<int, zero>; // テンプレートにも渡せる
constexpr int always_zero() { return 0; } // constexpr 関数 constexpr int compiletime_zero = always_zero(); // コンパイル時呼出 int runtime_zero = always_zero(); // 実行時呼出
constexpr int always_zero() { return 0; } // constexpr 関数 constexpr int compiletime_zero = always_zero(); // コンパイル時呼出 int runtime_zero = always_zero(); // 実行時呼出 struct literal_type { }; // リテラル型のクラス constexpr auto literal = literal_type{ }; // クラスインスタンスを定数式に
constexpr の実装技法や落し穴については、以下の資料にて網羅的に解説されています。
これは 2011/12/3 Boost.勉強会 #7 東京 にて、
『中3女子でもわかる constexpr』と題して発表した時のものです。
- 中3女子でもわかる constexpr