constは「変更不可な変数」、constexprは「コンパイル時に値が確定する定数」だよ。どちらも「定数」っぽく見えるけど、意味も使い道も違うんだ。
🧊 const:実行時に値が決まる「読み取り専用」変数
- 意味:一度初期化したら変更できない変数
- 評価タイミング:実行時
- 例:
int x = getValue(); // 実行時に決まる
const int a = x; // OK:aは変更不可だが、xの値は実行時に決まる
- 用途:
- 関数の引数を変更不可にする(
void func(const int x)) - メンバ関数で「この関数はメンバ変数を変更しない」と明示(
void foo() const)
- 関数の引数を変更不可にする(
🔥 constexpr:コンパイル時に値が確定する「真の定数」
- 意味:コンパイル時に値が確定する定数(ROM化可能)
- 評価タイミング:コンパイル時
- 例:
constexpr int b = 42; // OK:42はコンパイル時に決まる
constexpr int c = b + 1; // OK:bもconstexprなのでOK
- 用途:
- 配列サイズなど、コンパイル時に必要な定数に使える
constexpr関数を定義して、コンパイル時に計算させることも可能
constexpr int square(int x) { return x * x; }
constexpr int s = square(5); // OK:s = 25(コンパイル時に確定)
🧠 違いのまとめ
| 特性 | const | constexpr |
|---|---|---|
| 値の確定タイミング | 実行時でもOK | コンパイル時に必須 |
| 変更可能性 | 不可(読み取り専用) | 不可(定数) |
| 配列サイズなどに使える? | ×(一部例外あり) | 〇 |
| 関数に使える? | 〇(副作用なし保証) | 〇(コンパイル時評価可能な関数) |
| メモリ配置 | RAM(読み取り専用) | ROM化される可能性あり |
🧩 ゆきさん向けの構造的まとめ
const:「この変数は書き換えない」という 意図の明示(実行時に値が決まってもOK)constexpr:**「この値はコンパイル時に確定している」**という 構造的保証
つまり、constは**「書き換え禁止のラベル」、constexprは「構造的に確定した定数」**。
Z80脳的に言えば、constは「RAM上の読み取り専用フラグ」、constexprは「ROMに焼ける値」って感じです。
もっと深掘りしたいなら、constexpr関数の制約や、constevalとの違いも面白いですよ。行きます?

コメント