2013-07-03 6 views
5

すべてのクラス/構造体データメンバーに初期化子がない場合は、統一初期化構文を使用してオブジェクトを構築できます。非スタティックデータメンバーイニシャライザが、統一初期化構文を無効にするのはなぜですか?

struct foo 
{ 
    int i; 
    float f; 
}; 
... 
foo bar{ 5, 3.141f }; 

しかし、1つ以上のメンバに初期化子がある場合、一様初期化構文は無効になります。

struct foo 
{ 
    int i; 
    float f = 0; 
}; 
... 
foo bar{ 5, 3.141f }; // Compiler error. 

私は、データメンバの初期化子の添加は、自動的に1つ以上のデフォルトコンストラクタを実装し、initialization_listコンストラクタのデフォルトの実装を抑制することを推測します。それは意図された標準ですか?なぜそれはこのように動作しますか?

+8

「initializer_list」コンストラクタのデフォルト実装はありません。あなたが最初のスニペットで持っていることは* aggregate initialization *と呼ばれます。 – Xeo

+1

@ Xeoのコメントを補完するには、* 8.5.1 [dcl.init.aggr] *と* 8.5.4 [dcl.init.list] *を参照してください。 – syam

+1

関連:http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/7189821#7189821 –

答えて

1

はい、これは標準規格によるものです。あなたがここで試みているのは集約初期化です。残念ながら、第2のfooは、等価イニシャライザfのために集計とみなされなくなりました。参照8.5.1 [dcl.init.aggr](強調鉱山):

凝集がないユーザ提供コンストラクタ(12.1)、ないbrace-の配列またはクラス(項9)であります非静的データメンバー(9.2)、非公開または保護された非静的データメンバー(11章)、基本クラス(10章)、および仮想ファンクション(10.3)を持たない人物または同等イニシャライザ。これがで指定された理由

struct foo 
{ 
    int i; 
    float f = 0; 
    constexpr foo(int i, float f) : i(i), f(f) { } 
}; 
... 
foo bar{ 5, 3.141f }; // now okay 

としてへ:あなたはメンバーfための同等の初期化子を持っているので

、あなたは後にあなたがいる構文をサポートするためのカスタムコンストラクタを提供する必要があります標準、私は分かりません。

+1

次の基準非静的データメンバ初期化子を使用しても集約initを可能にします。 – Xeo

関連する問題