显然sizeof(std::array<char, N>) != N
如果N == 0
. 它也不一定适用于N > 0
。§23.3.2.1 [array.overview]/p1-2:
标头<array>
定义了一个类模板,用于存储固定大小的对象序列。数组支持随机访问迭代器。array<T, N>
存储N
类型元素的实例T
,因此这
size() == N
是一个不变量。数组的元素是连续存储的,这意味着 ifa
是 an array<T, N>
then 它服从&a[n] == &a[0] + n
all的标识0 <= n < N
。
数组是可以使用语法初始化的聚合(8.5.1)
array<T, N> a = { initializer-list };
whereinitializer-list
是一个逗号分隔的列表,最多可N
包含其类型可转换为的元素T
。
§8.5.1 [dcl.init.aggr]/p1:
聚合是一个数组或一个类(第 9 条),没有用户提供的构造函数(12.1),没有私有或受保护的非静态数据成员(第 11 条),没有基类(第 10 条),也没有虚函数(10.3) )。
由于array
是聚合类型,它不能具有执行动态分配的自定义构造函数,并且它必须直接存储元素,因为它必须能够使用聚合初始化从初始值设定项列表进行初始化。但是,只要在初始化列表最多包含成员array<T, N> a = { initializer-list };
时具有定义的语义,标准中的任何内容都不会阻止实现在其 C 样式数组成员之后添加额外的东西。一个看起来像的实现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
.