我试图研究作为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
}