Вам разрешено отбрасывать только константу объекта, который известен , а не как const
.Например, интерфейс может передавать объекты с помощью указателя const
или ссылки const
, но вы передали объект, который не является const
и хотите / нужно его изменить.В этом случае может быть правильным отбросить константность.
С другой стороны, отбрасывание константности объекта, который был const
полностью, может привести к серьезным неприятностям: при доступе к этому объекту,в частности, при записи в нее система может вызывать всевозможные странные вещи: поведение не определено (стандартом C ++), а в конкретной системе это может вызвать, например, нарушение доступа (поскольку адрес объекта устроен так, чтобынаходиться в области только для чтения.)
Обратите внимание, что, несмотря на другой ответ, я видел, что const
объектам необходимо получить назначенный адрес, если адрес когда-либо был получен и использован каким-либо образом.В вашем коде выражение const_cast<int&>(maxint)
по существу получает адрес вашей константы int, который, очевидно, хранится в области памяти, помеченной как доступная только для чтения.Интересным аспектом вашего фрагмента кода является то, что он , по-видимому, работает, особенно при включении оптимизации: код достаточно прост, чтобы компилятор мог сказать, что измененное местоположение на самом деле не используется и не 'на самом деле попытаться изменить место в памяти!В этом случае нарушения доступа не сообщается.Это, по-видимому, тот случай, когда константа объявлена внутри функции (хотя константа также может находиться в стеке, который обычно не может быть помечен как доступный только для чтения).Другим потенциальным результатом вашего кода (независимо от того, объявлена ли константа внутри функции или нет) является то, что она фактически изменяется и иногда читается как 100, а в других контекстах (которые так или иначе включают адрес) как 200.