非静的メンバーの初期化は、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
のように)データメンバ宣言またはメンバ関数宣言(あるかどうか曖昧ですin T
)。
追加された機能を使用すると、このparantheses構文でメンバーを初期化できないため、これは問題にはなりません。これらは、データのみのメンバーになることができますので、我々はこれ以上何の問題もない
int i = x;
int i{x};
:あなたのようなブレース・オア・イコール初期化子を使用する必要があります。
非スタティックメンバーイニシャライザを提案するときに考慮しなければならない問題を詳しく徹底的に見てみると、提案書N2628を参照してください。
C++ 11では使用できます。 – chris
私のコンパイラは私に言った:* "エラー:データメンバ初期化子は許可されていません" *。 – danijar
あなたのコンパイラは(すべての)C++ 11をまだサポートしていません。 –