为了使用某些值初始化std::array
,您需要使用以下方法:
std::array<int,3> an_array{{3,4,5}};
我知道我们需要两个大括号(一个用于std::array
而另一个用于内部c-style array
)。
我的问题:为什么,按标准,std::array
不包含直接初始化内部c-style array
的初始化列表构造函数?对于初始化是不是更友好的眼睛:
std::array<int,3> an_array{3,4,5};
修改
此信息来自http://en.cppreference.com/w/cpp/container/array。我以为我的编译器允许第二个版本直接作为非标准扩展。现在,我甚至不确定这个案例的标准是什么。
//构造使用聚合初始化
std::array<int, 3> a1{ {1, 2, 3} };
// C ++ 11中所需的双括号(不是在C ++ 14中)
答案 0 :(得分:6)
标准定义std::array
如下(C ++ 11的N3337,但引用的部分在N4140中是相同的):
§23.3.2.1[array.overview] / 2
数组是可以使用语法
初始化的聚合array<T, N> a = { initializer-list };
,聚合定义为:
§8.5.1[dcl.init.aggr] / 1
聚合是一个没有用户提供的数组或类 构造函数,没有私有或受保护的非静态数据成员,没有基础 类,没有虚函数。
所以它不能有一个用户定义的构造函数,initializer_list
构造函数。
此外,C ++ 11仅为T x = { a }
语法定义了大括号:
§8.5.1[dcl.init.aggr] / 11
在表格
的声明中T x = { a };
大括号可以在初始化列表中省略,如下所示。 [...]
而C ++ 14(N4140)提出了这个要求:
§8.5.1[dcl.init.aggr] / 11
可以在初始化列表中省略大括号,如下所示。 [...]
所以以下是完全有效的C ++ 14及以上版本:
std::array<int,3> an_array{3,4,5}