функции нет? (прочитал в твиттере у jasonturner)
Please don't ever do this:
cpp
constexpr int some_val = 1;
// other code
void some_func() {
some_func_that_may_modify_param(const_cast<int &>(some_val));
}
#thatsUB
>const_cast обычно можно использовать нельзя
непонятно сформулировал, ты имеешь в виду почему конкретно тут это прям вообще плохо?
const_cast можно использовать только в случаях, когда есть гарантия, что исходные данные не являются const.
Или есть гарантии, что вызываемая функция их не меняет - привет сишным API с их char*-литералами
ещё советую почитать про типы памяти, что константы могут хранится в специальной области памяти только для чтения и т.д.
Ну, да. UB проявляется не в момент каста, а в момент собственно записи (хотя сейчас может всплыть холивар с *nullptr)
там функция с const_cast вызывается внутри другой функции. будет разница если просто вызвать ту, что с const_cast?
Главное не попасться в ловушку CreateProcess
Ещё раз: const_cast'ы - это небезопасные преобразования типов, после которых нужно самостоятельно следить за тем, чтобы все гарантии соблюдались. Можно кастовать что угодно во что угодно, но если где-то в программе произойдёт запись по non-const ref, которая на самом деле ссылается на const объект, произойдёт UB.
Я просто не помню, чем окончился разбор случая int& ref = *(int*)nullptr;, поэтому решил сделать уточнение. В случае constов такой необычной ситуации возникнуть не должно, как мне кажется
прямой запрет, я полагаю
Не-не, раз это был долгий холивар, значит он точно не решается одной строчкой стандарта :))
мы там много вариантов разбирали же. этот мне вообще не запомнился, честно говоря
Возможно, я перепутал пример
CreateProcessW? Угу... Но RTFM спасет
Спасёт, но точно не от головной боли...
Обсуждают сегодня