Примечание. Этот вопрос был переименован и уменьшен, чтобы сделать его более сфокусированным и читаемым. Большинство комментариев относятся к старому тексту.
В соответствии со стандартом объекты другого типа могут не иметь одинаковое расположение памяти. Поэтому это не будет законным:
std::array<short, 4> shorts;
int* i = reinterpret_cast<int*>(shorts.data()); // Not OK
Однако стандарт допускает исключение из этого правила: к любому объекту можно получить доступ с помощью указателя на char
или unsigned char
:
int i = 0;
char * c = reinterpret_cast<char*>(&i); // OK
Однако мне непонятно, разрешено ли это другим способом. Например:
char * c = read_socket(...);
unsigned * u = reinterpret_cast<unsigned*>(c); // huh?