std::array 的数据成员在标准库实现中是公共的。为什么?



我试图研究作为C++标准库一部分的容器的标准库实现。我的机器上有Microsoft Visual Studio 2022,我可以转到std::array类的头文件定义。

当我到达std::array类的类定义的末尾时,我注意到数据成员没有被声明为私有的,在它之上是所有的公共成员函数,因此也使数据成员成为公共的。

因此,为了测试它,我尝试在main()中定义的std::array对象中访问它,令我惊讶的是,我可以访问它,它也在输出中打印了正确的值!

#include <array>
#include <iostream>
int main() 
{
std::array<int, 5> staticArray{0,1,2,3,4};
std::cout << staticArray._Elems[1] << std::endl;
}

这是允许的吗?!任何人都可以破坏数据,对吧?

std::array必须有一个公共成员才能满足std::array是聚合的要求。

数组是一个聚合,可以用最多N个类型可转换为T的元素进行列表初始化。

https://eel.is/c++草稿/阵列号概述-2

但是,它没有指定公共成员的名称,因为唯一的要求是它是一个可以列表初始化的聚合。

_Elems不一定与其他标准库实现兼容。

关于您担心任何人都可以破坏数据,任何人都已经可以通过任何可变访问器做到这一点:data()operator[]

@mpark做得很对。(嗨,迈克尔!(

template <typename T, size_t SZ>
struct Arr1 {
public:
T elems[SZ];
};

template <typename T, size_t SZ>
struct Arr2 {
private:
T elems[SZ];
};
int main () {
static_assert (std::is_aggregate<Arr1<int, 4>>::value, ""); // OK
static_assert (std::is_aggregate<Arr2<int, 4>>::value, ""); // fails
}

最新更新