Вроде, понял. Есть две переменные. Та, в памяти, которая оставлена для указателя, и та, которая в стеке, похоже, для ускорения доступа.
Следовательно, если компилить без оптимизации, то переменная будет только одна, и var = 3 *pVar = 3.
===========================================
Я просто первый раз встречаюсь с таким приемом, как снятие константности с помощью сишного привидения типов.
А теперь вроде дошло. Это выражение:
*(int*)pVar = 2;
можно прочесть как привести значение константной переменной, на которую ссылается pVar, к типу int (во время это операции снимается константность) и присвоеть ей единицу. Просто по правилу, в роде надо написать было (int*)*pVar = 2; - это меня и смутило. Почему не записано так? При этом варианте, компилятор пишет,что не может изменить значение константного объекта.
Я думаю, может все дело в этапах. При (int*)*pVar = 2; варианте в первом этапе идет приведние типа. А потом попытка изменить консанту[ 1. (int*) 2. *pVar = 2;]. А при *(int*)pVar = 2; все идет в один этап. Переменная на которую ссылается указатель, приводится к типу int (потому и звездочка раньше)и сразу изменяется, а уже потом объявляется константой. Я верно предположил???
А теперь действительно страшное предположение
. Я учусь в 11-м классе, и, как говорится, от скуки на все руки. Вот и играюсь с Си++. А Си++ учу сам по книжкам.
Цитата:
Но! const_cast, так же как и и сишное приведение, является грязным хаком.
|
Если переменная константа - то это не спроста и менять тут ничего не надо. Но, ИМХО, с другой сторону Бьерн Страуструп не от балды вставил в язык оператор const_cast. Значит, есть ситуации, когда он может сильно пригодится.