Quando e como a conversão para o ponteiro de caracteres é permitida?

Podemos olhar para a representação de um objeto do tipoT convertendo umT* que aponta para esse objeto em umchar*. Pelo menos na prática:

int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
  std::cout << std::setw(2) << (int)cp[i] << ' ';
}

Isso produz a representação de511 no meu sistema:ff 01 00 00.

Há (certamente) algum comportamento definido pela implementação que ocorre aqui. Qual dos elencos está me permitindo converter umint* para umunsigned char* e quais conversões isso envolve? Estou invocando comportamento indefinido assim que eu lancei? Posso conjurar qualquerT* tipo assim? O que posso confiar ao fazer isso?

questionAnswers(7)

yourAnswerToTheQuestion