我正在阅读 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]
x2[0]
和p2
的大小都是10。只要你不尝试在第10个元素以上进行算术(例如p2+10
)那么你就不应该在UB土地,对吗?
我发现的最接近答案的内容在71631428中提供,但它并没有完全回答我的问题。
编辑:
是什么意思?int(*)[10]
我终于找到了答案,它是如此基础的知识:“指向大小为 10 的整数数组的指针”。 关于 UB 的另一个问题仍然存在。所以我会适当地编辑标题。
只要你不尝试进行第 10 个元素以上的算术运算(例如 p2+10),那么你就不应该在 UB 区域,对吗?
“可达”并不意味着试图达到它的行为。 “可达”就是这个意思。做这个算术是“可能”的。 可能性的行为,即你可以编写这样的代码,使其“可达”。算术不一定要发生,有可能发生,所以是可达的。
通过结果可到达的每个字节都可以通过 p 到达(如果这些字节位于可与 y 进行指针互转换的对象 z 的存储中,则可以通过指向对象 y 的指针来到达这些字节,或者在立即以 z 为元素的封闭数组)。