为什么std::array不包含初始化列表构造函数

Why std::array does not contain an initializer-list constructor

本文关键字:初始化 列表 包含 构造函数 std array 为什么      更新时间:2023-10-16

为了用一些值初始化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不需要)

标准对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}