2012-02-05 24 views
7

C++ 11の新機能を楽しむことができますが、時には私はその微妙な点をいくつか見逃しているように感じることがあります。初期化リストのstd :: array initializerリストの初期化リスト

int配列の初期化は正常に動作しますが、Element2ベクターの初期化はうまくいきますが、Element2配列の初期化は失敗します。私は、正しい構文は、コメント行ではないと思うが、初期化の試みのどれも私のために成功していない。

#include <array> 
#include <vector> 

class Element2 
{ 
    public: 
      Element2(unsigned int Input) {} 
      Element2(Element2 const &Other) {} 
}; 

class Test 
{ 
    public: 
      Test(void) : 
        Array{{4, 5, 6}}, 
        Array2{4, 5}, 
        //Array3{4, 5, 6} 
        Array3{{4, 5, 6}} 
        //Array3{{4}, {5}, {6}} 
        //Array3{{{4}, {5}, {6}}} 
        //Array3{Element2{4}, Element2{5}, Element2{6}} 
        //Array3{{Element2{4}, Element2{5}, Element2{6}}} 
        //Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}} 
        {} 
    private: 
      std::array<int, 3> Array; 
      std::vector<Element2> Array2; 
      std::array<Element2, 3> Array3; 
}; 

int main(int argc, char **argv) 
{ 
    Test(); 
    return 0; 
} 

私はこれをMinGWでg ++ 4.6.1および4.6.2で試しました。

この配列を正しく初期化するにはどうすればよいですか?出来ますか?

+0

これは初期化リストとはあまり関係ありません。それをもっとポイントにするために質問を編集するのが適切だろうか? – rendaw

答えて

6

正しい方法はArray{{4, 5, 6}}です。集約初期化を使用してメンバーを初期化するときは、中括弧を省略できません。 std::array自体の一つ、とintアレイの1:あなたはすべての中括弧を入力する必要があなたのケースで非常にあなたが中括弧を省略することができる唯一の時間は、フォーム

T t = { ... } 

の宣言です。 Array3については、intを暗黙的にElement2に変換できるため、構文も正しくなります。

残っているコメントのうち、Array3{{{4}, {5}, {6}}},Array3{{Element2{4}, Element2{5}, Element2{6}}}およびArray3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}}も問題ありません。しかし、概念的にはArray3{{{4}, {5}, {6}}}は、コピーの初期化の代わりにコピーリストの初期化を使用するため、コピーエリジョン(これは無関係ですが、まだよく知っていると思います)、さらにArray3{{4, 5, 6}}よりも少ない実装では、あなたのElement2のために、暫定的に仲介を生成しないデザインによって

+0

GCCが正常に動作するはずですか? OPは、これらのバリエーションのすべて*が失敗すると言っているからです。また、 'std :: array 'は集合体ではないので、これは実際にどのように機能しますか?私は集合体の要求仕様を挙げることができ、 'std :: array 'はそのテストに失敗します。集合体の初期化によって非集約をどのように初期化することができるかについての仕様を引用できますか?あなたが間違っていると言っているわけではありません。私はC++ 11の仕様を完全に読んだことは一度も認めていません。同時に、私はあなたの主張の真実性を示すいくつかの証拠を希望します。 –

+1

@NicolBolas私が理解しているように、 'std :: array 'は集合体です。それは、ユーザ定義のコンストラクタのない構造体であり、 ''の記述では集合体として明示的に言及されています。 – hvd

+0

@nico what hvd says –

関連する問題