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