質問: C++11の変数宣言(constexpr関数については考慮しなくて大丈夫です)において `constexpr` と`static constexpr` は何か挙動が異なりますか? まったく同じ挙動なのでしょうか。もしそうなら `static constexpr` で宣言してるのは単に `static const` の癖で書いてしまってるだけと判断していいのでしょうか。
回答: こんにちは。 > > constexpr関数については考慮しなくて大丈夫です > > > constexpr指定された変数について回答します。(値を変更できないので「変数」と表現するのは微妙ですが) > > まったく同じ挙動なのでしょうか。 > > > かなり異なります。 static修飾子があるかないかの差はPineMatsuさんが書いているような差があります。 | 対象変数 | static無し | static有り | | --- | --- | --- | | グローバル変数 | 外部リンケージ有り | 外部リンケージ無し | | ローカル変数 | スタック上に記録 | static領域に記録 | | メンバ変数 | インスタンス内に記録 | static領域に記録 | > > もしそうなら static constexpr で宣言してるのは単に static const の癖で書いてしまってるだけと判断していいのでしょうか。 > > > ケースバイケースなのでそれだけではなんとも言えません。 constexprが変数に指定たされた時は「コンパイル時定数」を宣言します。「リードオンリーな変数」になることはありません。 constは微妙です。「コンパイル時定数」になる時もあればならない時もあります。 本来constは「リードオンリーな変数」の意味と思いますが、配列の要素数に使えるようにするため、例外的にコンパイル時定数となる場面があると理解してます。 「コンバイル時定数」はコンパイル時に値が決まります。 「リードオンリーな変数」は初期化時に値が決まります。動的に初期化した場合、動的に値を決定することができます。静的に初期化した時に「コンパイル時定数」になるのだろうと思います。 原理的に「コンバイル時定数」に記憶領域は要らない筈ですが、アドレスを取れました。 私の知らないルールがありそうです。