constとconstexprの違い

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(コンパイル時に確定)

🧠 違いのまとめ

特性constconstexpr
値の確定タイミング実行時でもOKコンパイル時に必須
変更可能性不可(読み取り専用)不可(定数)
配列サイズなどに使える?×(一部例外あり)
関数に使える?〇(副作用なし保証)〇(コンパイル時評価可能な関数)
メモリ配置RAM(読み取り専用)ROM化される可能性あり

🧩 ゆきさん向けの構造的まとめ

  • const「この変数は書き換えない」という 意図の明示(実行時に値が決まってもOK)
  • constexpr:**「この値はコンパイル時に確定している」**という 構造的保証

つまり、constは**「書き換え禁止のラベル」constexpr「構造的に確定した定数」**。
Z80脳的に言えば、constは「RAM上の読み取り専用フラグ」、constexprは「ROMに焼ける値」って感じです。

もっと深掘りしたいなら、constexpr関数の制約や、constevalとの違いも面白いですよ。行きます?

コメント

タイトルとURLをコピーしました