Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何描述对std::array的底层数据成员的直接访问?_C++_C++11_Stdarray - Fatal编程技术网

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
应如何存储其数据。“至少是连续的。”我知道这不是很精确。我编辑了我的答案。