C++ 11以前では、整数型または列挙型の静的constメンバーに対して、クラス内初期化しか実行できませんでした。 Stroustrup discusses this in his C++ FAQ、次の例を与える:だから、なぜこれらの不便な制限は存在しないC++ 11では、非静的メンバーおよび非constメンバーのクラス内初期化が可能です。何が変わったの?
:?
class Y { const int c3 = 7; // error: not static static int c4 = 7; // error: not const static const float c5 = 7; // error: not integral };
そして、次の推論をクラスは通常、ヘッダーファイルで宣言され、ヘッダーファイルは通常多くの翻訳単位に含まれます。しかし、複雑なリンカー規則を避けるために、C++ではすべてのオブジェクトに一意の定義が必要です。この規則は、C++がオブジェクトとしてメモリーに格納する必要があるエンティティーのクラス定義を許可した場合には破られます。
しかし、C++ 11は、非静的メンバ(§12.6.2/ 8)の中のクラス初期化できるように、これらの制限を緩和する:場合、非委任コンストラクタにおいて
を与えられた非静的データメンバーまたは基本クラスは、mem-initializer-id(mem-initializer-listがない場合を含み、コンストラクタがctor-initializerを持たないことを含む)およびエンティティ抽象クラス(10.4)の仮想基本クラスではない場合、
- エンティティがブレースまたは同等イニシャライザを持つ非静的データメンバーである場合、エンティティは8.5で指定されたとおりに初期化されます。
- エンティティがバリアントメンバ(9.5)である場合、初期化は実行されません。
- エンティティは、デフォルトで初期化されます(8.5)。
彼らはconstexpr
指定子でマークされている場合は、セクション9.4.2にも非const静的メンバーの中に、クラスの初期化を可能にします。
C++ 03での制限の理由はどうでしたか? 「複雑なリンカルール」を単に受け入れるか、これを実装しやすくするために変更されたものがありますか?
何事もなかっ上FAQを所有しています。コンパイラはこれらすべてのヘッダー専用のテンプレートでよりスマートに成長しているので、比較的簡単に拡張できます。 –