Problemas de aliasing podem ser evitados com variáveis const

Minha empresa usa um servidor de mensagens que envia uma mensagem para umconst char* e o lança no tipo de mensagem.

Fiquei preocupado com isso depois de perguntaressa questão. Não estou ciente de nenhum mau comportamento no servidor de mensagens. É possível queconst variáveis não apresentam problemas de alias?

Por exemplo, digamos que foo seja definido emMessageServer de uma destas maneiras:

Como parâmetro:void MessageServer(const char* foo)Ou como variável const no topo deMessageServer: const char* foo = PopMessage();

AgoraMessageServer é uma função enorme, mas nunca atribui nada afoo, no entanto, em 1 pontoMessageServerlógica defoo vai ser convertido para o tipo de mensagem selecionado.

auto bar = reinterpret_cast<const MessageJ*>(foo);

bar será lido apenas posteriormente, mas será usado extensivamente para a configuração do objeto.

Um problema de aliasing é possível aqui ou o fato de quefoo só é inicializado e nunca modificado, me salva?

EDITAR:

Resposta de Jarod42 não encontra nenhum problema ao transmitir a partir de umconst char* para umMessageJ*, mas não tenho certeza se isso faz sentido.

Sabemos que isso é ilegal:

MessageX* foo = new MessageX;
const auto bar = reinterpret_cast<MessageJ*>(foo);

Estamos dizendo que isso de alguma forma a torna legal?

MessageX* foo = new MessageX;
const auto temp = reinterpret_cast<char*>(foo);
auto bar = reinterpret_cast<const MessageJ*>(temp);

Meu entendimento deResposta de Jarod42 é que o elenco paratemp torna legal.

EDITAR:

Eu recebi alguns comentários em relação à serialização, alinhamento, passagem de rede e assim por diante. Não é disso que se trata esta questão.

Esta é uma pergunta sobrealiasing estrito.

O aliasing estrito é uma suposição, feita pelo compilador C (ou C ++), de que o referenciamento de ponteiros para objetos de tipos diferentes nunca se referirá ao mesmo local da memória (ou seja, alias um ao outro).

O que estou perguntando é:A inicialização de umconst objeto, transmitindo de umchar*, sempre será otimizado abaixo de onde esse objeto é convertido para outro tipo de objeto, para que eu esteja transmitindo dados não inicializados?

questionAnswers(5)

yourAnswerToTheQuestion