Size: a a a

2021 July 07

t

theadla in pro.cxx
почему const_cast в любых других случаях можно использовать, а в функции нет? (прочитал в твиттере у 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
источник

VS

Vlad Serebrennikov in pro.cxx
>const_cast обычно можно использовать
нельзя
источник

K

Kelbon in pro.cxx
непонятно сформулировал, ты имеешь в виду почему конкретно тут это прям вообще плохо?
источник

АК

Александр Караев... in pro.cxx
const_cast можно использовать только в случаях, когда есть гарантия, что исходные данные не являются const.
источник

D

Dmitriy in pro.cxx
Или есть гарантии, что вызываемая функция их не меняет - привет сишным API с их char*-литералами
источник

K

Kelbon in pro.cxx
ещё советую почитать про типы памяти, что константы могут хранится в специальной области памяти только для чтения и т.д.
источник

АК

Александр Караев... in pro.cxx
Ну, да. UB проявляется не в момент каста, а в момент собственно записи (хотя сейчас может всплыть холивар с *nullptr)
источник

t

theadla in pro.cxx
там функция с const_cast вызывается внутри другой функции. будет разница если просто вызвать ту, что с const_cast?
источник

d

disba1ancer in pro.cxx
Главное не попасться в ловушку CreateProcess
источник

АК

Александр Караев... in pro.cxx
Ещё раз: const_cast'ы - это небезопасные преобразования типов, после которых нужно самостоятельно следить за тем, чтобы все гарантии соблюдались. Можно кастовать что угодно во что угодно, но если где-то в программе произойдёт запись по non-const ref, которая на самом деле ссылается на const объект, произойдёт UB.
источник

VS

Vlad Serebrennikov in pro.cxx
почему всплывет? тут же все аналогично — проблема не в самой операции, а доступе (записи) через полученное lvalue
источник

АК

Александр Караев... in pro.cxx
Я просто не помню, чем окончился разбор случая int& ref = *(int*)nullptr;, поэтому решил сделать уточнение. В случае constов такой необычной ситуации возникнуть не должно, как мне кажется
источник

t

theadla in pro.cxx
ясно, спасибо
источник

VS

Vlad Serebrennikov in pro.cxx
прямой запрет, я полагаю
источник

АК

Александр Караев... in pro.cxx
Не-не, раз это был долгий холивар, значит он точно не решается одной строчкой стандарта :))
источник

VS

Vlad Serebrennikov in pro.cxx
мы там много вариантов разбирали же. этот мне вообще не запомнился, честно говоря
источник

АК

Александр Караев... in pro.cxx
Возможно, я перепутал пример
источник

ES

Egor Suvorov in pro.cxx
Нет
источник

D

Dmitriy in pro.cxx
CreateProcessW?
Угу... Но RTFM спасет
источник

d

disba1ancer in pro.cxx
Спасёт, но точно не от головной боли...
источник