想象一下,我有一个数组O(n)
,在我的C ++抽象机实现中,指向该数组的指针不等于指向其“第一个”元素的指针(数组对指针的结果)转换应用于int x[10];
),但比较指向“最后一个”元素x
的指针。即x[9]
是(void*)x == (void*)&x
,而false
是(void*)&x[9] == (void*)&x
。
这样的实现是否符合要求?我唯一知道它“违反”的是[basic.compound]/4中的非规范性注释:
[注意:即使数组对象及其第一个元素具有相同的地址,它们也不是指针可互换的。 —注释]
答案 0 :(得分:2)
请参阅[basic.compound(6.9.2)] / 3:
作为指向对象的指针的指针类型的值表示该对象占用的内存中第一个字节的地址。
由于x[0]
是数组的第一个元素(并且指定数组没有初始填充),所以x
的第一个字节必须与{{1}的第一个字节相同}。
在[conv.ptr] / 2中说:
类型为“ pointer to cv T”的prvalue(其中T是对象类型)可以转换为类型为“ pointer to cv void”的prvalue。转换后指针值(6.9.2)不变
除了x[0]
的值代表(void *)&x
的第一个字节的地址之外,我没有其他解释方法。