在this article中,提到了关于整数和指针的reinterpret_cast
的以下内容:
(不保证相反方向的往返转换;同一指针可能有多个整数表示)
我是否正确理解标准不能保证以下内容:
intptr_t x = 5;
void* y = reinterpret_cast<void*>(x);
assert(x == reinterpret_cast<intptr_t>(y));
有人可以证实吗?
你的解释是正确的。该标准的相关段落是C ++ 17中的[expr.reinterpret.cast] / 5:
可以将整数类型或枚举类型的值显式转换为指针。转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射在其他方面是实现定义的。 [注意:除非在6.7.4.3中描述,否则这种转换的结果将不是安全派生的指针值。 - 结束说明]
因此,虽然从指针到整数的映射保证具有左反(因此是单射的),但不保证它是双射的;它是否是“实现定义”行为的一部分。正如cppreference指出的那样,可能有几个整数转换为相同的指针。
可能没有与平台地址空间的宽度完全匹配的整数类型。 intptr_t
必须足够大以容纳任何指针值,这意味着它比指针大或大,当它更大时,鸽笼原则保证每个整数值不可能具有唯一的void*
值。