Есть два вида постоянства.
Константность объекта является неотъемлемым свойством объекта. Это не может быть изменено.
Подумайте о странице в печатной книге. Его можно рассматривать как строку символов, и его нельзя изменить. Это говорит то, что говорит, и все тут. Так что это const string
.
Теперь подумайте о доске. На нем может быть что-то написано. Вы можете стереть это и написать что-то еще. Таким образом, доска неконстантна string
.
Другим видом константности является указатель и эталонная константность. Эта константность не является неотъемлемым свойством указываемого объекта, но разрешение . Он говорит, что вы не можете изменять объект через этот указатель . В нем ничего не говорится о том, можно ли изменить сам объект.
Так что, если у вас есть константный указатель, вы не обязательно знаете, на что он действительно указывает. Может быть, это страница книги. Может быть, это доска. Указатель не сообщает.
Теперь, если вы как-то знаете, что это действительно доска, вы можете быть противным и требовать разрешения пойти дальше и изменить то, что написано на нем. Это то, что делает const_cast. Это дает вам разрешение на что-то.
Что произойдет, если вам потребуется разрешение на изменение строки, и она окажется напечатанной страницей? Вы получаете свое разрешение, вы идете дальше и стираете его ... и ... Что именно происходит, это undefined . Возможно, вообще ничего. Возможно, отпечаток размазан, и вы не можете ни распознать оригинальную строку, ни написать что-нибудь сверху. Возможно, ваш мир взрывается на мелкие кусочки. Вы можете попробовать и увидеть, но нет гарантии, что завтра произойдет то же самое.