а мне помнится, что UB - модифицировать объект, который был создан как const. Но сначала привести к const, а потом убрать обратно - не UB.
только если изначальный объект const
Не всегда
Условно std::string const_cast на c_str метод
Думаю это норм если сама строка не const
угу, мы тут сами добавили константность в методе и потом сами убрали, это точно не должно быть уб, так же делают во всяких any_cast-ах, когда добавляют конст чтобы вызвать any_cast для конст типа, потом убирают обратно, ну и вроде не такой плохой прием..
вот передали вы c_str куда-то, там кто-то умный снял const и изменил строку. Откуда вызывающий код об этом узнает?
А если кто то умный memcpy сделал на твоём объекте? Как вызывающий код об этом узнает?
это другое дело, а вообще странно сишная функция которая принимает const char* и что-то меняет, это звучит весьма странно, не? условно указатель то может быть на литерал из data секции, тогда это уже уб вообще
memcpy'ть нетривиальные объекты ведь UB?
делать копии const объекта никто не мешает, снимать const и изменять объект - потенциально стрелять себе в ногу
А если там Сишный код из другого модуля?))
Дак не изменяй тогда объект
А что нетривиального в char*? Который ещё чем угодно может быть.
Строго говоря, если это аккуратно раскидать между TU, чтобы каждый следующий шаг был строго noinline и недоступен компилятору, то оно даже будет работать. Другое дело, что в исходной точке объект может разрушиться - и это повлечёт за собой последствия
Обсуждают сегодня