8

私は C++11 の新機能を大いに楽しんでいますが、その微妙な点のいくつかが欠けているように感じることがあります。

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でこれを試しました。

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

4

1 に答える 1

7

これについての正しい方法はArray{{4, 5, 6}}. 集合体の初期化でメンバーを初期化するときは、中かっこを省略できません。中括弧を省略できるのは、フォームの宣言のみです。

T t = { ... }

したがって、あなたの場合、すべての中かっこを入力する必要があります.1つはstd::arrayそれ自体用、もう1つはint配列用です。の場合、暗黙的に変換できるArray3ため、構文も正しいです。intElement2

残りのコメントされたものから、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

于 2012-02-05T10:36:48.463 に答える