В качестве фона, Страуструп говорит в «Дизайн и развитие C ++» (13.3.2 Уточнение определения const
):
Чтобы гарантировать, что некоторые, но не все объекты const
могут быть помещены в постоянную память (ПЗУ), я принял правило, что любой объект, имеющий конструктор (то есть требуется инициализация во время выполнения), не может быть поместить в ПЗУ, но другие const
объекты могут.
...
Объект, объявленный const
, считается неизменным с момента завершения конструктора до начала его деструктора. Результат записи в объект между этими точками считается неопределенным.
При первоначальном проектировании const
я помню, как утверждал, что идеальный const
будет объектом, доступным для записи до запуска конструктора, а затем становится доступным только для чтения с помощью некоторой аппаратной магии и, наконец, после входа в деструктор. снова становится доступным для записи Можно представить архитектуру с тегами, которая действительно работает таким образом. Такая реализация вызовет ошибку времени выполнения, если кто-то сможет записать объект, определенный const
. С другой стороны, кто-то может записать объект, не определенный const
, который был передан как const
ссылка или указатель. В обоих случаях пользователь должен сначала сбросить const
. Смысл этого представления состоит в том, что отбрасывание const
для объекта, который был первоначально определен const
, и последующая запись в него в лучшем случае не определено, тогда как выполнение того же самого для объекта, который не был определен const
, является законным и четко определены.
Обратите внимание, что при таком уточнении правил значение const
не зависит от того, имеет ли тип конструктор или нет; в принципе все они делают. Любой объект, объявленный const
, теперь может быть помещен в ПЗУ, помещен в сегменты кода, защищен контролем доступа и т. Д., Чтобы гарантировать, что он не мутирует после получения своего начального значения. Однако такая защита не требуется, потому что современные системы не могут в целом защитить каждую const
от любой формы коррупции.