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)
有人可以确认吗?
你的解释是正确的。该标准的相关段落是 C++17 中的 [expr.reinterpret.cast]/5:
整数类型或枚举类型的值可以显式转换为指针。一个指针转换为一个足够大的整数(如果实现中存在这样的整数)并返回到相同的指针类型将具有其原始值;指针和整数之间的映射是由实现定义的。[注意:除了 6.7.4.3 中描述的那样,这种转换的结果不会是安全派生的指针值。—尾注]
因此,虽然从指针到整数的映射保证有左逆(因此是单射的),但不能保证它是双射的;它是否是“实现定义”行为的一部分。正如 cppreference 指出的那样,可能有几个整数转换为同一个指针。
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |