以下我在3.7.4.3/3节中遇到过:
整数值是安全派生的整数表示 指针,只有它的类型至少和std :: intptr_tand一样大 是以下之一:
[...]
- 添加剂或按位的结果 操作,其操作数之一是a的整数表示 安全派生的指针值
P
,如果该结果转换为reinterpret_cast<void*>
将等于安全派生的 指针可从reinterpret_cast<void*>(P)
计算。
好的,让int *P = new int(1);
成为一个指针,long p_int = <reinterpret_cast<long>(P);
表示整数。请考虑以下代码:
int *P = new int(1); //Safely-derived pointer
long p_int = <reinterpret_cast<long>(P); //Integer representation of safely derived pointer
long new_p_int = p_int + 10; // Result of an additive operation
void *new_P = reinterpret_cast<void*>(new_p_int);
void *P_cpnverting_to_void = reinterpret_cast<void*>(P);
cout << "P converted to void* = " << P_cpnverting_to_void << endl;
cout << "P after result of an additive operation = " << new_P << endl;
规则不明确。结果指针如何比较等于reinterpret_cast(P)?在应用添加剂操作后,它们永远不会相等。你能提供反映规则的实际例子吗?
答案 0 :(得分:2)
关键点是reinterpret_cast<void*>
产生的指针必须与来自 reinterpret_cast<void*>(P)
的可安全导出指针进行比较。
它不必等于reinterpret_cast<void*>(P)
。
考虑以下示例,其中我们展示了与从reinterpret_cast<void*>(P)
计算的安全派生指针的相等性。
#include <iostream>
#include <stdint.h>
using namespace std;
int main(){
int *P = new int(1); //Safely-derived pointer
uint64_t p_int = reinterpret_cast<uint64_t>(P);
uint64_t new_p_int = p_int + 10; // Result of an additive operation
void *new_P = reinterpret_cast<void*>(new_p_int);
void *P_computed_from_void_star = reinterpret_cast<void*>(P) + 10;
cout << "P converted to void* = " << P_computed_from_void_star << endl;
cout << "P after result of an additive operation = " << new_P << endl;
}