gpt4 book ai didi

c++ - `reinterpret_cast` a `T*` 到 `T(*)[N]` 是未定义的行为吗?

转载 作者:IT老高 更新时间:2023-10-28 12:58:06 25 4
gpt4 key购买 nike

考虑以下场景:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com