我在第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;
}