虽然我很喜欢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上试过这个。
我应该如何正确地初始化这个数组?有可能吗?
答案 0 :(得分:6)
正确的解决方法是Array{{4, 5, 6}}
。使用聚合初始化初始化成员时,不能省略大括号。您可以省略大括号的唯一时间是声明
T t = { ... }
因此,在您的情况下,您必须输入所有大括号:一个用于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
的复制列表初始化,这不会产生设计中的临时 。