在void指针中存储整数的往返安全性

时间:2017-12-31 17:28:09

标签: c++ pointers language-lawyer reinterpret-cast

this article中,针对整数和指针的 reinterpret_cast ,提到了以下内容:

  

(无法保证相反方向的往返转换;同一指针可能有多个整数表示)

我是否正确理解标准不能保证以下内容:

intptr_t x = 5; 
void* y = reinterpret_cast<void*>(x);
assert(x == reinterpret_cast<intptr_t>(y));

有人可以确认吗?

2 个答案:

答案 0 :(得分:3)

您的解释是正确的。该标准的相关段落是[expr.reinterpret.cast] / 5 in C ++ 17:

  

可以将整数类型或枚举类型的值显式转换为指针。指针转换为   一个足够大小的整数(如果在实现上存在任何这样的整数)并返回相同的指针类型   将具有其原始价值;指针和整数之间的映射在其他方面是实现定义的。   [注意:除了6.7.4.3中所述之外,这种转换的结果不是安全派生的指针   值。 - 结束记录]

因此,虽然从指针到整数的映射保证具有左反(因此是单射的),但不保证它是双射的;它是否是“实现定义”行为的一部分。正如cppreference指出的那样,可能有几个整数转换为相同的指针。

答案 1 :(得分:0)

可能没有与平台地址空间宽度完全匹配的整数类型。 c必须足够大以容纳任何指针值,这意味着它比指针大或大,当它更大时,鸽笼原则保证每个整数值都不可能有一个唯一的intptr_t值。