Моя компания использует сервер обмена сообщениями, который получает сообщение в 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
инициализирован и никогда не менялся, сохранил?
EDIT:
Ответ 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
делает его законным.
EDIT:
Я получил некоторые комментарии относительно сериализации, выравнивания, передачи сети и т.д. Это не тот вопрос, о котором идет речь.
Это вопрос о строгом псевдониме.
Строгое сглаживание - это предположение, сделанное компилятором C (или С++), что указатели разыменования объектов разных типов никогда не будут ссылаться на одно и то же место в памяти (то есть псевдоним eachother.)
Я спрашиваю: Будет ли инициализация объекта const
путем кастинга из char*
, когда-либо оптимизирована ниже, где этот объект передается другому типу объекта, так что я литье из неинициализированных данных?