2012-01-14 13 views
12

std::array<T>は基本的にstructでラップされたCスタイルの配列です。 structの初期化には中カッコが必要であり、配列の初期化には中カッコも必要です。std :: array <T>初期設定

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

しかし、私が見てきたサンプルコードのほとんどは唯一の括弧のペアを1つ使用しています:だから私は括弧の2組が必要

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

許可され、これを来て、それはどんな利点を持っていますどのようにまたは最初のapprochと比較して欠点?

+0

を指定しなければならないということです++ 11のドラフトを作成したり、警告を出力したりすることができます。 – ildjarn

+0

@ildjarn Johannesによると、許可されています。 – fredoverflow

答えて

14

利点は、入力することが少なくなっていることです。しかし、欠点は、宣言にそのフォームがある場合にのみ中括弧を外すことが許されていることです。 =を省略するか、配列がメンバで、member{{1, 2, 3, 4, 5}}で初期化する場合は、1組の中カッコを渡すことはできません。

これは、中括弧がf({{1, 2, 3, 4, 5}})のように関数に渡されると、オーバーロードの曖昧さが懸念されたためです。しかし、それはいくつかの議論を引き起こし、問題報告が生成されました。

基本的には、= { ... }初期化は常に新しいものではないのです

int a[][2] = { 1, 2, 3, 4 }; 

のように、括弧を省略することができました。おそらくそのコードを受け入れるコンパイラは、以前のCに基づいています - どのような新しいのは、あなたが=を省略することができますが、その後、あなたは、私はそれが標準で許可されて_is_わからないんだけど、すべてのブレース

int a[][2]{ {1, 2}, {3, 4} }; 
+0

1組の中括弧のみを持つことを正当化する標準的な見積もりを提供できますか? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –

関連する問題