個人メモ.
C++の定数
- C++の定数は2種類ある
constexprの概要
- constexpr宣言された変数はコンパイル時に定数になる
constexpr int zero = 0; // constexpr 変数 auto x = foo<int, zero>; // テンプレートに渡すことが可能
- constexpr宣言された関数やコンストラクタは,コンパイル時と実行時に呼び出せる
constexpr int zero(){return 0;} // constexpr関数 constexpr int cc_time_zero = zero(); // コンパイル時に呼び出し int runtime_zero = zero(); // 実行時に呼び出し
struct literal_type{}; constexpr auto literal = literal{};
constとの違い
- const
- 固定長配列のサイズはコンパイル時定数のみを指定できる.
- したがって,以下はエラーになる.
(Xは定数だが,xは実行時定数)
struct X { int n; }; const X x = {123}; int a[x.n] = { 1 };
- これを解決するには,Xにconstexpr指定し,明示的にコンパイル時定数として扱う.
struct X { int n; }; constexpr X x = {123}; int a[x.n] = { 1 };