初始化列表中的std :: array初始化列表初始化

ren*_*daw 7 c++ arrays initializer-list initialization-list c++11

虽然我非常喜欢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;
}
Run Code Online (Sandbox Code Playgroud)

我在MinGW下的g ++ 4.6.1和4.6.2上尝试了这个.

我应该如何正确地初始化这个数组?可能吗?

Joh*_*itb 6

正确的解决方法是Array{{4, 5, 6}}.使用聚合初始化初始化成员时,不能省略大括号.唯一可以省略大括号的是表单的声明

T t = { ... }
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您必须输出所有大括号:一个用于std::array自身,一个用于int数组.因为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,这不会产生临时的设计中介.