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

时间:2015-10-13 01:38:03

标签: c++ c++11

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的界面吗?

1 个答案:

答案 0 :(得分:6)

标准委员会通过使您的代码非法来做得很好。您正在使用实现保留标识符。如果你打算故意用脚射击自己,那那不是委员会的问题。

在这种特殊情况下,&#34;滥用&#34;甚至不重要,因为您可以通过&#34;官方&#34;访问该数据。接口无论如何。但即使情况并非如此,再说一次:不要故意做愚蠢的事情。