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

时间:2016-10-25 11:14:51

标签: c++ arrays c++11

为了使用某些值初始化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中)

1 个答案:

答案 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}