![](/img/trans.png)
[英]Pass initializer list to function for initialization of std::array
[英]std::array initializer list initialization in initialization list
尽管我非常喜欢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上尝试过这个。
我应该如何正确初始化该数组? 可能吗?
解决此问题的正确方法是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}}}}
工作,但比较罗word。 但是从概念Array3{{{4}, {5}, {6}}}
会在不执行复制省略的实现上产生最少的临时数量(我想这是无关紧要的,但还是很容易知道),甚至更少而不是Array3{{4, 5, 6}}
,因为您不是使用复制初始化,而是使用Element2
复制列表初始化,这在设计上不会产生中间临时对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.