标准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
将导致未定义行为。
void *
并返回(以及何时不能)。 - Martin Bonner supports Monica