为什么 std::launder 多维数组是未定义的行为?

问题描述 投票:0回答:1

我正在阅读 std::launder 的文档,我发现了这个代码片段:

int x2[2][10];
auto p2 = std::launder(reinterpret_cast<int(*)[10]>(&x2[0][0]));
// Undefined behavior: x2[1] would be reachable through the resulting pointer to x2[0]
// but is not reachable from the source

int(*)[10]
是什么意思?
我将其读为“大小为 10 的整数数组”。但UB的评论对我来说没有意义。
x2[0]
p2
的大小都是10。只要你不尝试在第10个元素以上进行算术(例如
p2+10
)那么你就不应该在UB土地,对吗?

我发现的最接近答案的内容在71631428中提供,但它并没有完全回答我的问题。

编辑:

int(*)[10]
是什么意思?

我终于找到了答案,它是如此基础的知识:“指向大小为 10 的整数数组的指针”。 关于 UB 的另一个问题仍然存在。所以我会适当地编辑标题。

c++ syntax undefined-behavior stdlaunder
1个回答
0
投票

只要你不尝试进行第 10 个元素以上的算术运算(例如 p2+10),那么你就不应该在 UB 区域,对吗?

“可达”并不意味着试图达到它的行为。 “可达”就是这个意思。做这个算术是“可能”的。 可能性的行为,即你可以编写这样的代码,使其“可达”。算术不一定要发生,有可能发生,所以是可达的。

通过结果可到达的每个字节都可以通过 p 到达(如果这些字节位于可与 y 进行指针互转换的对象 z 的存储中,则可以通过指向对象 y 的指针来到达这些字节,或者在立即以 z 为元素的封闭数组)。
© www.soinside.com 2019 - 2024. All rights reserved.