C++ 如何描述对std::array的底层数据成员的直接访问?
我见过C++ 如何描述对std::array的底层数据成员的直接访问?,c++,c++11,stdarray,C++,C++11,Stdarray,我见过std::array的实现,其中所有成员都是public。但是,这并不意味着应该通过引用其名称直接访问底层数组(或任何类型的数据成员)。我知道访问上述成员的标准方式是通过std::array::data() 有没有一个ISO C++标准描述了直接访问底层数据成员的尝试,通过引用它的名字?< /P> 让我们假设底层的public数据成员是一个固定大小的数组,其名称是\u data std::数组a{}; a、 _data[0]=“a”; 《ISOC++标准》是如何描述第二个语句的?这是未定
std::array
的实现,其中所有成员都是public
。但是,这并不意味着应该通过引用其名称直接访问底层数组(或任何类型的数据成员)。我知道访问上述成员的标准方式是通过std::array::data()
有没有一个ISO C++标准描述了直接访问底层数据成员的尝试,通过引用它的名字?< /P> 让我们假设底层的
public
数据成员是一个固定大小的数组,其名称是\u data
std::数组a{};
a、 _data[0]=“a”;
《ISOC++标准》是如何描述第二个语句的?这是未定义的行为吗?“C++”标准没有定义在哪个成员名<代码> STD::数组< /代码>下存储数组。它没有说明是否应该有一个名为
\u arr
或\u data
或其他名称的成员。它指定一些函数,如data
和operator[]
和at
来访问数据。因此,如果要编写遵循C++标准的代码,则绑定到指定的函数。如果您有一个STL实现,并且看到std::array
有一个公共成员arr
,那么您可以使用它。但您将拥有不可移植的代码,并且无法与STL的其他实现一起工作。更糟糕的是:如果STL的作者不能保证std::array
不会更改,他可以在将来的更新中更改成员的名称。STL仍然是C++标准兼容,但是您的代码将不再编译。
缩短:不应该直接使用数据成员,应该通过C++标准化函数访问它。依赖给定的成员名称是实现定义的行为。
我不理解这个问题。您是否在询问直接访问公共成员是否非法?如果参考底图数组是公共的,则可能是实现定义的,并且它的名称也是公共的。你为什么要依赖那些根本不可移植的东西呢?关于.data()
,什么不是直接的?您可以执行&arr[0]
如果您认为这样更好。@Kaldrr它必须是公共的,因为std::array
依赖于聚合初始化,并且没有(用户声明的)构造函数。我已经更新了这个问题。我知道数据成员的名称是实现定义的,任何人都不应该试图直接引用它。如果出于任何原因,有人试图这样做,标准会如何描述这种尝试?这是未定义的行为吗?未指定?@AJTan实现已定义。该标准确实讨论了std::array
应如何存储其数据。“至少是连续的。”我知道这不是很精确。我编辑了我的答案。