Can Aliasing Problems be Avoided with const Variables

Моя компания использует сервер обмена сообщениями, который доставляет сообщение вconst char* и затем преобразует его в тип сообщения.

Я стал беспокоиться об этом после того, как спросилэтот вопрос, Я не знаю ни о каком плохом поведении на сервере обмена сообщениями. Возможно ли, чтоconst переменные не вызывают проблем с псевдонимами?

Например, скажем, что foo определяется вMessageServer одним из следующих способов:

В качестве параметра:void MessageServer(const char* foo)Или как константная переменная в верхней частиMessageServer: const char* foo = PopMessage();

СейчасMessageServer это огромная функция, но она никогда ничего не назначаетfooОднако в 1 точкеMessageServerлогикаfoo будут быть приведенным к выбранному типу сообщения.

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

bar будет прочитан только впоследствии, но будет широко использоваться для настройки объекта.

Возможна ли здесь проблема с алиасами?foo только инициализируется, и никогда не изменяется, кроме меня?

РЕДАКТИРОВАТЬ:

Jarod42 ответ не находит проблем с кастингом изconst char* кMessageJ*, но я не уверен, что это имеет смысл.

Мы знаем, что это незаконно:

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

Мы говорим, что это как-то делает законным?

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

Мое пониманиеJarod42 ответ это актёрский составtemp делает это законным.

РЕДАКТИРОВАТЬ:

Я получил несколько комментариев, касающихся сериализации, выравнивания, передачи по сети и так далее. Вопрос не в этом.

Это вопрос острогое наложение.

Строгий псевдоним - это предположение, сделанное компилятором C (или C ++), что разыменование указателей на объекты разных типов никогда не будет ссылаться на одну и ту же область памяти (то есть псевдоним eachother.)

Я спрашиваю:Будет ли инициализацияconst объект, отливая изchar*когда-нибудь оптимизировать, где этот объект приведен к объекту другого типа, так что я выполняю преобразование из неинициализированных данных?

Ответы на вопрос(0)

Ваш ответ на вопрос