Const означает, что указатель или ссылка не могут использоваться для операции записи или чтения-изменения-записи без исключения const. Это НЕ означает, что стандарт C ++ пытается утверждать, что это означает (стандарт C ++ просто ошибается в этом).
Переменная определена так:
/* auto */ int const x = 1;
явно НЕ доступен только для чтения, так как в противном случае его нельзя было бы инициализировать. Скорее, тип переменной x - это «ссылка const на int» (и НЕ ссылка на const int) или, в качестве альтернативы, lvalue const of int. Обратите внимание, что «const» связан с указателем или ссылкой, он не имеет ничего общего с хранилищем, а также с типом значения, находящегося в этом хранилище.
Это довольно прискорбно, поскольку контракт, предоставленный const, чрезвычайно слаб и, в частности, не позволяет кэшировать указанную или указанную ячейку памяти именно потому, что это НЕ означает неизменяемое хранилище.
Суть: const - это модификатор доступа , связанный с символьной ссылкой или указателем, который используется программистом, чтобы позволить провайдеру символа установить обязательство на клиенте символа или для символа клиент обещает провайдеру символов, что он не изменяет память через этот символ (например, функция, принимающая указатель const на int, обещает не изменять указатель на int).
Это не имеет ничего общего с переменными:
int const *p = (int*)malloc(sizeof(int));
и явно не имеет отношения к хранилищу (хранилище malloc всегда доступно для записи).
Вместо этого вы должны думать о const как о способе передачи инвариантов, обязательств или требований между частями программы, устанавливаемых программистом для целей программистов и распространяемых системой типов. К сожалению, система типов не является надежной и не может правильно распространять константу:
X *last;
struct X { int a; X() : a(0) { last=this; } };
X const x; // x is const?
last->a = 1; //really ??
ИМХО единственная возможность, которую компилятор может сделать хранилищем неизменным, - это фактические константы, такие как строковые литералы (возможно) или статическое (глобальное) хранение. На практике автоматическое, кучное и временное хранилище невозможно сделать доступным только для чтения.