const
не предназначен для того, чтобы сделать переменную доступной только для чтения.
Значение const x
в основном таково:
Привет, компилятор, пожалуйста, не позволяйте мне случайно писать код в этой области, который изменяет x
.
Это сильно отличается от:
Эй, компилятор, пожалуйста, предотвратите любые изменения в x
в этой области.
Даже если вы сами не напишете никаких const_cast
- компилятор все равно не будет предполагать, что const
'ed сущности не изменятся. В частности, если вы используете функцию
int foo(const int* x);
, компилятор не может предположить, что foo()
не изменяет память, на которую указывает x
.
Вы можете использовать свое значение без переменная
Переменные различаются ... поэтому, естественно, способ предотвратить это - использовать значения, которые не хранятся в переменных. Вы можете добиться этого, используя ...
- перечисление с одним значением:
enum : int { number = 1 }
. - препроцессор:
#define NUMBER 1
<- Не рекомендуется </li> - функция:
inline int get_number() { return 1; }
Вы можете использовать реализацию / платформу c особенности
Как предлагает @SebastianHoffman, типичные платформы позволяют маркировать некоторую часть виртуальной памяти процесса пространство как доступное только для чтения, поэтому попытки изменить его приводят к сигналу нарушения доступа к процессу и приостановке его выполнения. Это не решение в самом языке, но часто бывает полезным. Пример: когда вы используете строковые литералы, например:
const char* my_str = "Hello world";
const_cast<char*>(my_str)[0] = 'Y';
Ваш процесс, скорее всего, завершится ошибкой с сообщением, например:
Segmentation fault (core dumped)