I wonder if C++ implementations are allowed to represent pointers to different types differently. For instance, if we had 4-byte sized/aligned int
and 8-byte sized/aligned long
, would it be possible to represent pointers-to-int
/long
as object addresses shifted right by 2/3 bits, respectively? This would effectively forbid to convert a pointer-to-long
into a pointer-to-int
.
I am asking because of [expr.reinterpret.cast/7]:
An object pointer can be explicitly converted to an object pointer of a different type. When a prvalue
v
of object pointer type is converted to the object pointer type “pointer to cvT
”, the result isstatic_cast<cv T*>(static_cast<cv void*>(v))
.[Note 7: Converting a pointer of type “pointer to
T1
” that points to an object of typeT1
to the type “pointer toT2
” (whereT2
is an object type and the alignment requirements ofT2
are no stricter than those ofT1
) and back to its original type yields the original pointer value. — end note]
The first sentence suggests that we can convert pointers to any two object types. However, the empathized text in the (not normative) Note 7 then says that the alignment plays some role here as well. (That's why I came up with that int
-long
example above.)