I can't understand the quote (specifically, the bold part):
A prvalue of type “pointer to cv1 void” can be converted to a prvalue of type “pointer to cv2 T”, where T is an object type and cv2 is the same cv-qualification as, or greater cv-qualification than, cv1. If the original pointer value represents the address A of a byte in memory and A does not satisfy the alignment requirement of T, then the resulting pointer value is unspecified.
int i = 0;
void *vp = &i;
auto *res = static_cast<double*>(vp);
My questions are:
does the address pointed by
res
(address ofint
) satisfy the alignment requirement ofdouble
?does the resulting pointer
res
has an unspecified value?And when I have something like this:
static_cast<double*>(static_cast<void *>(&i))
Doesi
type is not stricter than the target typedouble
? so that the result of this expression is not unspecified
That would depend on the implementation. Most likely it doesn't. Typically the alignment requirement of
int
is smaller than that ofdouble
.For example on the x86-64 System V ABI used e.g. on Linux,
int
has alignment requirement4
anddouble
has8
.You can check that the alignment requirement is satisfied for example with the following
static_assert
:If the alignment requirement is not fulfilled (i.e. the
static_assert
fails), yes. Otherwise it will point to the objecti
.This is exactly equivalent to what is shown in the snippet.
Note that even if the alignment requirements are satisfied,
res
cannot be used to access the value of the object it points to, because that would violate the pointer aliasing rules. So the result of the cast is very likely not useful for anything.