最佳答案
(关于 这个问题和答案。)
在 C + + 17标准之前,[基础化合物]/3中包含以下句子:
如果一个 T 类型的对象位于地址 A,那么一个值为地址 A 的 cv T * 类型的指针就会指向该对象,而不管该值是如何获得的。
但是从 C + + 17开始,这个句子就变成了 被移除了。
例如,我相信这个句子定义了这个示例代码,而且因为 C + + 17,这个未定义行为是:
alignas(int) unsigned char buffer[2*sizeof(int)];
auto p1=new(buffer) int{};
auto p2=new(p1+1) int{};
*(p1+1)=10;
在 C + + 17之前,p1+1
保存到 *p2
的地址并具有正确的类型,因此 *(p1+1)
是指向 *p2
的指针。在 C + + 17中,p1+1
是一个 指针 past-the-end ,所以它不是一个 指向对象的指针,我相信它是不可引用的。
这是对标准权利的这种修改的解释,还是有其他规则对删除所引句子作出补偿?