非静的メンバーの初期化は、C++11より前のこのように行うことはできませんでした。C ++ 11コンパイラでコンパイルする場合は、指定したコードを問題なく受け入れるはずです。
そもそも許可しないのは、データメンバー宣言が定義ではないからだと思います。導入されているオブジェクトはありません。のようなデータメンバーがある場合、クラスのタイプのオブジェクトを実際に作成するまで、オブジェクトは作成されませんint x;
。int
したがって、このメンバーの初期化子は誤解を招く可能性があります。メンバーに値を割り当てることができるのは構築中のみです。これは、まさにメンバー初期化リストの目的です。
非静的メンバーの初期化を追加する前に、いくつかの技術的な問題を解決する必要がありました。次の例を検討してください。
struct S {
int i(x);
// ...
static int x;
};
struct T {
int i(x);
// ...
typedef int x;
};
これらの構造体が解析されているとき、メンバーを解析するときにi
、それがデータメンバー宣言(のようにS
)であるかメンバー関数宣言(のようにT
)であるかがあいまいです。
追加された機能を使用すると、この括弧構文でメンバーを初期化できないため、これは問題になりません。次のような中括弧または等しい初期化子を使用する必要があります。
int i = x;
int i{x};
これらはデータメンバーにしかなれませんので、もう問題はありません。
非静的メンバー初期化子を提案するときに考慮しなければならなかった問題の詳細については、提案N2628を参照してください。