安全派生指针的整数表示形式



我在第3.7.4.3/3节中遇到了以下内容:

整数值是安全派生的仅当指针的类型至少与std::intptr_t一样大并且是以下之一:

[…]

--加法运算或逐位运算的结果操作,其中一个操作数是安全派生的指针值P,如果该结果由reinterpret_cast<void*>将与安全导出的可从CCD_ 3计算的指针。

好的,设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;

演示

规则不明确。如何将结果指针与interpret_cast(P(进行比较?在应用加法运算后,它们永远不会被比较相等。你能提供反映规则的实际例子吗?

关键点是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;
}

最新更新