安全派生指针的整数表示

时间:2014-08-07 04:37:41

标签: c++ pointers

以下我在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;

demo

规则不明确。结果指针如何比较等于reinterpret_cast(P)?在应用添加剂操作后,它们永远不会相等。你能提供反映规则的实际例子吗?

1 个答案:

答案 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;
}