出于好奇,我看了一下std :: array的LLVM实现,并注意到它是一个结构体。我看过的大多数其他STL容器(矢量,队列,地图)都是类。它作为一个结构出现在标准中,所以是故意的。为什么C++ 11 std :: array结构而不是类?
任何人都知道这可能是为什么?
出于好奇,我看了一下std :: array的LLVM实现,并注意到它是一个结构体。我看过的大多数其他STL容器(矢量,队列,地图)都是类。它作为一个结构出现在标准中,所以是故意的。为什么C++ 11 std :: array结构而不是类?
任何人都知道这可能是为什么?
从技术上讲,它既不是结构也不是类 - 它是一个模板。
std::array
必须是aggregate
。长话短说,这最终意味着它不能拥有任何私人的东西 - 所以它可能被写为struct
(默认为公开),而不是class
(默认为使所有内容私人的)。
如果你想你可以写为class
反正:
template <...>
class array {
public:
// ...
但你需要让一切公开,所以你还不如用一个struct
在默认情况下做到这一点。
std::array
是POD类型,以便它可以像这样进行初始化:
std::array<int, 5> arr = { 1, 2, 3, 4, 5 };
这是从在一个initializer_list
初始化不同阵列实际上并不对阵列元件和移动分配新的空间来自初始化器列表的数据在那里,但括号中的数据(最终在初始化的数据段中)是数组的内部表示。
这意味着没有复制或移动,实际上没有代码正在运行来初始化任何东西。只要将可执行文件加载到内存中,阵列就准备就绪。
它似乎是一个常用的POD类型结构的惯例,但我不知道这是否是原因。 –
聚合可能没有私人或受保护的成员,并且'std :: array'必须是聚合。 – dyp