Is the following code UB?
int i = 5;
void *p = &i;
int* &r = reinterpret_cast<int* &>(p);
int* p2 = r;
Please note I do not dereference pointer.
Is the following code UB?
int i = 5;
void *p = &i;
int* &r = reinterpret_cast<int* &>(p);
int* p2 = r;
Please note I do not dereference pointer.
Yes, it is UB.
reinterpret_cast<int* &>(p);
is equivalent to
*reinterpret_cast<int**>(&p);
reinterpret_cast of void** to int** is allowed, but the implicit dereference is UB because the type of data (void*) and the type it is being accessed as (int*) are not similar.
In this absolutely specific case without deferencing it should be okay I think. I verified pointer value. It's different story when sizeof(void*) and sizeof(int*) are different (although I do not know whether that is even possible).
By doing this, you are taking complete responsibility of very known scenario.
int i = 5;
void *p = &i; //convert int* => void*
int* &r = reinterpret_cast<int* &>(p); //convert void* which was int* to int*&
int* p2 = r; //**copy** address stays same