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

Zoo*_*mIn 1 c++ std

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

https://eel.is/c++draft/array#overview-2

然而,它没有指定公共成员应该命名什么,因为唯一的要求是它是一个可以列表初始化的聚合。

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

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

  • 请注意,因为 `_Elems` 以下划线开头,后跟大写字母,所以标准不允许您使用该名称(它们保留用于“任何用途”的实现)。因此,如果您的程序使用这样的标识符,即使您没有*定义*它,您也会得到未定义的行为。 (5认同)