- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下场景:
std::array<int, 8> a;
auto p = reinterpret_cast<int(*)[8]>(a.data());
(*p)[0] = 42;
这是未定义的行为吗?我认为是。
a.data()
返回一个int*
,与int(*)[8]
不一样
type aliasing rules关于 cppreference 似乎表明 reinterpret_cast
无效
作为程序员,我知道a.data()
指向的内存位置是8
int
的数组对象
我是否缺少任何规则使此 reinterpret_cast
有效?
最佳答案
一个数组对象和它的第一个元素不是指针可互转换的*,所以reinterpret_cast
的结果是一个类型为“指向8个数组的指针”的指针int
”,其值为“pointer to a[0]
”1。换句话说,尽管有类型,但它实际上并不指向任何数组对象。
然后代码将数组到指针的转换应用于解引用此类指针所产生的左值(作为索引表达式 (*p)[0]
的一部分) 2。仅当左值实际引用数组对象3 时,才指定该转换的行为。由于这种情况下的左值没有,因此行为未定义省略4。
*如果问题是“为什么一个数组对象和它的第一个元素不能指针互转换?”,它已经被问过了:Pointer interconvertibility vs having the same address .
1见[expr.reinterpret.cast]/7 , [conv.ptr]/2 , [expr.static.cast]/13和 [basic.compound]/4 .
2见[basic.lval]/6 , [expr.sub]和 [expr.add] .
3 [conv.array] : "结果是指向数组的第一个元素的指针。"
4 [defns.undefined] : 未定义行为是“本文档未强加任何要求的行为”,包括“当本文档省略任何明确的行为定义时”。
关于c++ - `reinterpret_cast` a `T*` 到 `T(*)[N]` 是未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444004/
我是一名优秀的程序员,十分优秀!