【发布时间】:2018-06-04 01:55:33
【问题描述】:
working draft of the standard N4659 说:
[basic.compound]
如果两个对象是指针可互转换的,那么它们的地址相同
然后注意到
一个数组对象和它的第一个元素不是指针互转换的,即使它们有相同的地址
使数组对象及其第一个元素不可指针互转换的基本原理是什么?更一般地说,将指针互转换的概念与具有相同地址的概念区分开来的基本原理是什么?是不是哪里有矛盾?
看起来,给定这个语句序列
int a[10];
void* p1 = static_cast<void*>(&a[0]);
void* p2 = static_cast<void*>(&a);
int* i1 = static_cast<int*>(p1);
int* i2 = static_cast<int*>(p2);
我们有 p1 == p2,但是,i1 定义明确,使用 i2 会导致 UB。
【问题讨论】:
-
@Someprogrammerdude 数组不是指针,但数组的第一个元素也不是指针(通常)。我猜“指针可互转换”是关于标准化何时可以通过静态转换在基指针和派生指针之间转换为
void*并返回(以及何时不能)。 -
我发现这一段关于static_cast
(void*) 也是obscurantist [expr.static.cast]: "。否则,如果原来的指针值指向一个对象a,并且有一个类型为 T 的对象 b(忽略 cv 限定),它可以与 a 进行指针互转换(6.9.2),结果是指向 b 的指针。否则,指针值不会因转换而改变。”。如果指针值指向正确的地址,它是一个有效的指针值吗? -
如果您阅读下面的 cmets |this question](stackoverflow.com/questions/47616508/…),您会了解到 C++ 内存模型已经并且仍然主要受 Boehm 的影响,Boehm 出售垃圾收集器库。自从我阅读此评论后,我怀疑 C++ 内存模型中的不一致是由于其兴趣的影响,而不是出于理性原因。
-
@xskxzr 如果数组是结构的第一个成员并且我们有一个指向数组第一个元素的指针并且想要访问该结构怎么办?
标签: c++ arrays pointers language-lawyer c++17