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

zse*_*zse 4 c++ pointers language-lawyer reinterpret-cast

本文中,提到了有关reinterpret_cast整数和指针的以下内容:

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

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

intptr_t x = 5; 
void* y = reinterpret_cast<void*>(x);
assert(x == reinterpret_cast<intptr_t>(y));
Run Code Online (Sandbox Code Playgroud)

有人可以确认吗?

Bri*_*ian 5

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

整数类型或枚举类型的值可以显式转换为指针。一个指针转换为一个足够大的整数(如果实现中存在这样的整数)并返回到相同的指针类型将具有其原始值;指针和整数之间的映射是由实现定义的。[注意:除了 6.7.4.3 中描述的那样,这种转换的结果不会是安全派生的指针值。—尾注]

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