【发布时间】:2021-11-28 16:48:05
【问题描述】:
std::array 是...(引自cppreference):
此容器是一种聚合类型,其语义与将 C 样式数组
T[N]作为其唯一非静态数据成员的结构相同。
这是否意味着数组的地址总是与其第一个元素的地址相同,即data()?
#include <array>
#include <iostream>
int main()
{
std::array<int,6> x{};
std::cout << &x << "\n";
std::cout << x.data();
}
可能的输出:
0x7ffc86a62860
0x7ffc86a62860
如果是,这有什么用吗?以下是否允许?
int* p = reinterpret_cast<int*>(&x);
for (int i=0;i<6;++i){ std::cout << p[i]; }
【问题讨论】:
-
你为什么要做
reinterpret_cast<int*>(&x)而不仅仅是x.data()? -
C 有一个规则,任何
struct的地址都等于它的第一个成员的地址,并且指向一个的指针可以安全地转换为另一个。 C++ 对classes 有相同的规则吗?我不太确定在标准中的哪个位置。 -
实际上我没有在标准中看到“仅非静态数据成员”;该标准似乎并未排除其他成员。 cppreference 弥补了吗?
-
@NateEldredge 静态成员,无论是数据还是方法或其他任何东西,都不会占用对象分配的存储空间中的任何空间。只有非静态数据成员才会这样做。
-
您正在假设标准定义的类的内部布局。与这些事情一样,该标准没有明确说明内部布局应该是什么(我也看不到任何提及它只有一个数据成员)。
标签: c++ language-lawyer stdarray