【发布时间】:2018-07-04 18:27:08
【问题描述】:
考虑以下场景:
std::array<int, 8> a;
auto p = reinterpret_cast<int(*)[8]>(a.data());
(*p)[0] = 42;
这是未定义的行为吗?我认为是。
a.data()返回一个int*,与int(*)[8]不一样cppreference 上的 type aliasing rules 似乎表明
reinterpret_cast无效作为程序员,我知道
a.data()指向的内存位置是8int对象的数组
我是否缺少任何规则使 reinterpret_cast 有效?
【问题讨论】:
-
std::array必须是一个连续的容器。因此,问题归结为int * p使得[p; p+N)已知是一个有效的指针范围是否可以转换为int[N]。 -
误导性标题。做指针转换从来都不是UB。潜在的问题是通过取消引用转换结果来访问内存
标签: c++ language-lawyer reinterpret-cast strict-aliasing c++17