明显地
sizeof(std::array<char, N>) != N
如果
N == 0
。它也不一定适用于
N > 0
.
§23.3.2.1【阵列概述】/p1-2:
收割台
<array>
定义用于存储固定大小的类模板
对象序列。数组支持随机访问迭代器。一
的实例
array<T, N>
商店
N
类型的元素
T
因此
size() == N
是不变量。存储数组的元素
连续,意味着如果
a
是一个
阵列<T、 N>
然后它服从
身份
&a[n] == &a[0] + n
为所有人
0 <= n < N
.
数组是
可以使用语法初始化的聚合(8.5.1)
array<T, N> a = { initializer-list };
哪里
initializer-list
是以逗号分隔的列表,最多包含
N
类型可转换为的元素
T
.
§8.5.1[dcl.init.agr]/p1:
聚合是未提供用户的数组或类(第9条)
构造函数(12.1),没有私有或受保护的非静态数据成员
(第11条),没有基类(第10条),也没有虚拟函数
(10.3).
自从
array
是聚合类型,它不能有执行动态分配的自定义构造函数,并且必须直接存储元素,因为它必须能够使用聚合初始化从初始值设定项列表中初始化。然而,标准中没有任何内容阻止实现在其C样式数组成员之后添加额外的内容,只要
array<T, N> a = { initializer-list };
当
初始值设定项列表
最多包含个
N
成员。一个看起来像
template<typename T, size_t N>
struct array {
//typedefs and member functions omitted
T _Elems[N];
double _Because_I_can;
};
// specialization for N == 0 case omitted
完全合法。因此,不能保证
sizeof(std::array<char, N>) == N
.