こんにちはアサノです。
本日は入社してから知ったconstとconstexprについて、改めて詳しく調べてみようと思い立ったので記載してみました。
constexprとは
constexprとは定数を宣言し、その定数をコンパイル時に確定させるものです。
定数を宣言する方法の一つとしてよくconstが挙げられますが、明確な違いとして、値が確定するタイミングが違うという点があります。
constとconstexprの違い
前述の通り、Constとconstexprはどちらも定数宣言でありながら、値が確定するタイミングが違います。
これにはどういう利点があるかと言うと、
const側は、コンパイル時や実行時でも値を保持できる。
constexpr側は、コンパイル時にはすでに値が確定しており、実行時にその値の計算が必要ない。
ということです。
constとconstexprの使い分け
さて、上記の記述を見て、私は「constexprに全て置き換えればよいのではないか。」と考えました。
しかし、現実はそう上手く行かないようです。
constexprには条件があり、それは、
**コンパイル時に値が決まっている必要がある。**というものです。
例えを挙げるなら下記のような式になります。
int value = GetPower();
// 値がコンパイル時に決まっていないためエラーになる
constexpr int x = value;
上記は、値がコンパイル時に決まっていないために、エラーとなります。
自分の会社の開発環境では、下記のように.hに記述されているのをよく見かけます。
constexpr float MaxHp = 100.0f;
constexpr float MaxAtk = 10.0f;
constexpr float MaxDef = 5.0f;
こういった、実行時に値が決定する定数にも使用できるというのがconstの利点であると言えます。
以上。
本記事は、業務や学習を通して理解した内容を、自分自身の整理も兼ねてまとめたものです。内容に改善点や補足などがありましたら、ご指摘いただけますと幸いです。
以下は私がこの件を記載するにあたって学んだ用語です。