È consentito l’aliasing T * con char *. È permesso anche il contrario?

Nota: questa domanda è stata rinominata e ridotta per renderla più mirata e leggibile. La maggior parte dei commenti si riferisce al vecchio testo.


Secondo lo standard, oggetti di diverso tipo potrebbero non condividere la stessa posizione di memoria. Quindi questo non sarebbe legale:

std::array shorts; int* i = reinterpret_cast(shorts.data()); // Not OK 

Lo standard, tuttavia, consente un’eccezione a questa regola: a qualsiasi object è ansible accedere tramite un puntatore al char o al char unsigned char :

 int i = 0; char * c = reinterpret_cast(&i); // OK 

Tuttavia, non è chiaro per me se sia permesso anche il contrario. Per esempio:

 char * c = read_socket(...); unsigned * u = reinterpret_cast(c); // huh?