После выполнения программы компилятор больше не присутствует. Это работа сделана; программа была скомпилирована в исполняемый файл, и затем она может быть выполнена даже без установки компилятора. (Следовательно, можно распространять исполняемые файлы на машины без компилятора.)
Но даже если ваш вопрос был переписан для устранения этой проблемы, существует необоснованное и неправильное предположение:
g ++ должен каким-то образом хранить эту информацию, поэтому, когда другая строка пытается изменить cv
, во время выполнения знает: «О, это неверно, потому что я знаю, что 0xFF77 является const».
Фактически, среда выполнения не обязана останавливать изменение переменной. Это ответственность программиста. Когда вы объявляете переменную const
, вы сообщаете компилятору, что не будете изменять ее значение, что может позволить компилятору лучше оптимизировать работу. Такая оптимизация может потерпеть неудачу, если окажется, что вы действительно изменили переменную; это объясняется тем фактом, что изменение объявленного значения const
является «неопределенным поведением». (Неопределенное поведение действительно не определено. Выдача ошибки будет определенным поведением.)
При определенных обстоятельствах компилятор может фактически обнаружить во время компиляции, что переменная, объявленная const
, изменяется.
const int cv = 3;
cv = 42;
Большинство компиляторов выдадут предупреждение, если увидят вопиющее нарушение договора. Но это предупреждение, а не ошибка, и бывают случаи, когда компилятор вводится в заблуждение. Например, следующий код не может выдать ошибку, если предположить, что функция always_false
соответствует своему имени:
const int cv = 3;
if (always_false(cv)) cv = 42;
Короче говоря, C ++ не обязуется спасать вас от ваших ошибок; если вы решили писать программы на C ++, вы должны быть готовы к тому, что играете по правилам.