C++11 为什么C++;11 std::数组是一个结构而不是一个类?

C++11 为什么C++;11 std::数组是一个结构而不是一个类?,c++11,stdarray,C++11,Stdarray,出于好奇,我查看了std::array的LLVM实现,并注意到它是一个结构。我看过的大多数其他STL容器(vector、queue、map)都是类。它在标准中以结构形式出现,因此是有意的 有人知道为什么会这样吗?从技术上讲,它既不是结构也不是类——它是一个模板 std::array必须是集合。长话短说,这意味着它不能有任何私有的东西——因此它也可以写成结构(默认为将所有内容公开),而不是类(默认为将所有内容私有化) 如果您愿意,您可以将其编写为类: template <...> cl

出于好奇,我查看了std::array的LLVM实现,并注意到它是一个结构。我看过的大多数其他STL容器(vector、queue、map)都是类。它在标准中以结构形式出现,因此是有意的


有人知道为什么会这样吗?

从技术上讲,它既不是结构也不是类——它是一个模板


std::array
必须是
集合
。长话短说,这意味着它不能有任何私有的东西——因此它也可以写成
结构(默认为将所有内容公开),而不是
类(默认为将所有内容私有化)

如果您愿意,您可以将其编写为

template <...>
class array {
public:
// ...
模板
类数组{
公众:
// ...

但无论如何,您都需要将所有内容公开,因此您最好使用默认情况下可以公开的结构。

std::array
是一种POD类型,因此可以像这样初始化它:

std::array<int, 5> arr = { 1, 2, 3, 4, 5 };
std::array arr={1,2,3,4,5};
这与初始化器列表中的初始化不同,因为数组实际上并不为数组元素分配新空间,而是从其中的初始化器列表中移动数据,而是括号中的数据(最终在初始化数据段中)是数组的内部表示形式


这意味着没有复制或移动,事实上没有代码运行来初始化任何东西。一旦可执行文件加载到内存中,数组就可以运行。

创建POD类型结构似乎是一种经常使用的约定,尽管我不知道这是否是原因。聚合可能没有private或pro受保护的成员,并且
std::array
必须是聚合。感谢您的回答!您知道为什么决定将std::array作为聚合吗?@elSnape
std::array
比C++11(boost,C++03TR1)旧,并且对于
std::array my_arr={1,2,3,4,5}之类的内容,需要在C++03中使用聚合初始化语法;
@elSnape,因为std::array需要尽可能精简。设计决策是所有std::array的代码都应该在编译时消失,以使其与裸数组一样高效(空间和时间)。可变模板构造函数可以具有相同的语法,并移动省略(+优化)应该会导致相同的速度。@DyP否,因为这仍然需要代码才能运行。对于
std::array
而言,在运行时没有代码进行任何初始化。零。还记得我的另一篇文章吗?“无代码”是最快的。@DyP还解决了一些其他问题,如全局静态对象初始化和销毁的未定义顺序。这根本不适用于简单类型的
std::array
s。它们预先初始化并存在,直到操作系统释放进程的内存,就像C样式的数组一样。不能保证静态非constexpr对象将在静态初始化期间初始化。聚合初始化被指定为聚合成员的副本初始化。此外,使用g++4.8.1 at-O3时,
std::array
的程序集输出与使用所述模板的类似非聚合类型相比没有差异。@DyP 3.8“对象生存期”p1保证POD类型的生存期,只要“获得具有适当对齐方式和类型T大小的存储”,就不会进行任何非平凡的初始化。P2将其扩展到阵列。任何初始化的POD类型,无论是否为常量,都将放在“初始化数据”部分。