Является ли это неопределенным поведением для Const_cast-это константное представление о неконфессиональном розетке, полC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Является ли это неопределенным поведением для Const_cast-это константное представление о неконфессиональном розетке, пол

Сообщение Anonymous »

У меня есть код, который получает (не консервные) байты UDP через recv () системный вызов. Байтовый буфер затем передается в код на уровне бизнеса, который считывает байты, делая что-то вроде: < /p>

Код: Выделить всё

const auto* msg = reinterpret_cast(buffer); // BusinessMessage is a packed struct corresponding exactly to the bytes sent by the sender
... // through some framework code so I'm forced to keep the msg as const...
DoBusinessLogic(msg->GetField1(), msg->GetField2(), ...);
Примечание: этот вид reinterpret_cast в основном везде в коде и проверяется в бою на протяжении более десяти лет, хотя я знаю, что некоторые пуристы могут поднять возражения. Допустим, Field2 нужно изменить на какое -то другое значение. Как правило, правильный способ сделать это - использовать изменчивую переменную члена. Я не могу этого сделать из -за ограничений структуры (см. Пример кода ниже). Итак, я делаю это, добавив функцию CONST члена в BusinessMessage , которая фактически мутает Field2 , что-то вроде этого:
struct BusinessMessage : Field1, Field2, ... // sadly, I cannot change this impl so as to allow mutable member variables.
{
void NonConstSetField2(int value) const
{
const Field2* field = static_cast(this);
Field2* mutableField = const_cast(field);
mutableField->Set(value);
}
};
< /code>
Я проверил это под UB-санитизатором, и он не жалуется. < /p>
Коллега говорит, что это неопределенное поведение. Я не уверен, он может ошибаться, но я не знаю окончательно, если я прав. < /P>
это UB в соответствии со стандартом? Будет ли это безопасно с современным (например,> = 12) компилятором GCC, даже если он технически ub?


Подробнее здесь: https://stackoverflow.com/questions/796 ... cket-recei
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»