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

Hum*_*awi 7 c++ arrays c++11

std::array使用某些值初始化a ,您需要使用以下方法:

std::array<int,3> an_array{{3,4,5}};
Run Code Online (Sandbox Code Playgroud)

我知道我们需要两个花括号的原因(一个用于std::array内部,另一个用于内部c-style array).

我的问题:为什么,按标准,std::array不包含直接初始化内部的初始化列表构造函数c-style array?初始化为不是更友好的眼睛:

std::array<int,3> an_array{3,4,5};
Run Code Online (Sandbox Code Playgroud)

编辑:

此信息来自http://en.cppreference.com/w/cpp/container/array.我以为我的编译器允许第二个版本直接作为非标准扩展.现在,我甚至不确定这个案例的标准是什么.

//构造使用聚合初始化

std::array<int, 3> a1{ {1, 2, 3} }; // C++ 11中需要的双括号(不是在C++ 14中)

krz*_*zaq 6

该标准定义std::array如下(C++ 11的N3337,但引用的部分在N4140中相同):

§23.3.2.1[array.overview]/2

数组是可以使用语法初始化的聚合

array<T, N> a = { initializer-list };
Run Code Online (Sandbox Code Playgroud)

并且聚合定义为:

§8.5.1[dcl.init.aggr]/1

聚合是一个数组或类,没有用户提供的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数.

所以它不能有一个用户定义的构造函数initializer_list.


另外,C++ 11仅为T x = { a }语法定义了大括号:

§8.5.1[dcl.init.aggr]/11

在表格的声明中

T x = { a };
Run Code Online (Sandbox Code Playgroud)

大括号可以在初始化列表中省略,如下所示.[...]

而C++ 14(N4140)提出了这个要求:

§8.5.1[dcl.init.aggr]/11

可以在初始化列表中省略大括号,如下所示.[...]

所以以下是完全有效的C++ 14及以上版本:

std::array<int,3> an_array{3,4,5}
Run Code Online (Sandbox Code Playgroud)