我试图研究作为 C++ 标准库一部分的容器的标准库实现。我的机器上有 Microsoft Visual Studio 2022,我可以转到std::array类的头文件定义。
当我到达类的类定义的末尾时std::array,我注意到数据成员没有声明为私有,并且上面都是公共成员函数,因此也使数据成员成为公共的。
因此,为了测试它,我尝试在std::array定义的对象中访问它main(),令我惊讶的是我可以访问它,并且它也在输出中打印了正确的值!
#include <array>
#include <iostream>
int main()
{
std::array<int, 5> staticArray{0,1,2,3,4};
std::cout << staticArray._Elems[1] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是允许的吗?!任何人都可以破坏数据,对吗?
mpa*_*ark 12
需要有一个公共成员来满足聚合std::array的要求。std::array
数组是一个聚合,可以使用最多 N 个元素进行列表初始化,这些元素的类型可转换为 T。
然而,它没有指定公共成员应该命名什么,因为唯一的要求是它是一个可以列表初始化的聚合。
_Elems不一定与其他标准库实现兼容。
关于您担心任何人都能够破坏数据,任何人都可以通过任何可变访问器来做到这一点:data(),operator[]等