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