C++11 では、「定数式」の拡張された概念が導入されています。これは、次のconstexpr
キーワードを使用してオブジェクトに与えることができます。
constexpr int a = 12; // constant expression
constexpr int f(int n) { return a * n; }
constexpr int b = f(a); // also constant expression
オブジェクトにはコンストラクターも宣言されている場合がありconstexpr
ます。関数を定数式として修飾するためのルールは非常に制限的ですが、そのようなオブジェクトを作成できる場合、定数式であるグローバル オブジェクトは実際にコンパイル時に計算および格納される可能性があります。それらは「静的に初期化」されていると見なされます(基本的に、プログラムの起動前に初期化されます)。
C++11 より前は、最も単純なプリミティブ型のみがこのような処理に適格でした。
std::map
動的割り当てを必要とするものは、決して定数式にはならないため、静的に初期化されたグローバルのようなものを持つことは期待できません。