考虑以下情景:
std::array<int, 8> a;
auto p = reinterpret_cast<int(*)[8]>(a.data());
(*p)[0] = 42;
这算是未定义行为吗?我认为是。
a.data()
返回一个int*
,它和int(*)[8]
不同。cppreference 上的类型别名规则似乎表明
reinterpret_cast
是无效的。作为程序员,我知道
a.data()
指向的内存位置是一个包含8
个int
对象的数组。
我错过了什么规则使得这个 reinterpret_cast
是有效的吗?
std::array
要求是一个连续的容器。因此,问题归结为是否可以将已知为有效指针范围[p; p+N)
的int * p
强制转换为int[N]
。 - lisyarus