我可以直接访问 std::array 的数据,这是缺陷吗?

I can directly access std::array's data, is this a defect?

本文关键字:缺陷 数据 访问 std array 我可以      更新时间:2023-10-16

std::array的后果之一是其实现定义的数据必须是公共的,否则它将不再是聚合。这允许我做这样的事情:

#include <array>
#include <iostream>
int main()
{
    std::array<int, 5> arr{1, 2, 3, 4, 5};
    #if defined(_LIBCPP_VERSION)
        for (int i : arr.__elems_)
    #else
        for (int i : arr._M_elems)
    #endif
        std::cout << i;
}

这对我来说似乎相当不稳定,考虑到大多数标准库都被很好地封装和保护以免被误用。有什么解决办法吗?std::array的界面是否可以改进?

标准委员会认定你的代码是非法的。您正在使用实现保留标识符。如果你是故意搬起石头砸自己的脚,那就不是委员会的问题了。

在这种特殊情况下,"误用"甚至无关紧要,因为您无论如何都可以通过"官方"接口访问该数据。但是,即使不是这样,我还是要说:不要故意做傻事。