La mutable
palabra clave es una forma de perforar el const
velo que cubre con sus objetos. Si tiene una referencia constante o puntero a un objeto, no puede modificar ese objeto de ninguna manera, excepto cuándo y cómo está marcado mutable
.
Con su const
referencia o puntero, está obligado a:
- solo acceso de lectura para cualquier miembro de datos visible
- permiso para llamar solo a métodos que están marcados como
const
.
La mutable
excepción hace que ahora pueda escribir o establecer miembros de datos que están marcados mutable
. Esa es la única diferencia externamente visible.
Internamente, los const
métodos que son visibles para usted también pueden escribir en los miembros de datos que están marcados mutable
. Esencialmente, el velo constante está perforado de manera integral. Depende completamente del diseñador de API asegurarse de que mutable
no destruya el const
concepto y solo se use en casos especiales útiles. La mutable
palabra clave ayuda porque marca claramente a los miembros de datos que están sujetos a estos casos especiales.
En la práctica, puede usarlo const
obsesivamente en toda su base de código (esencialmente desea "infectar" su base de código con la const
"enfermedad"). En este mundo, los punteros y las referencias son const
con muy pocas excepciones, produciendo código que es más fácil de razonar y entender. Para una digresión interesante, busque "transparencia referencial".
Sin la mutable
palabra clave, eventualmente se verá obligado a usar const_cast
para manejar los diversos casos especiales útiles que permite (almacenamiento en caché, recuento de referencias, datos de depuración, etc.). Desafortunadamente, const_cast
es significativamente más destructivo que mutable
porque obliga al cliente API a destruir la const
protección de los objetos que está utilizando. Además, causa una const
destrucción generalizada : el uso const_cast
de un puntero o referencia constante permite la escritura sin restricciones y el método de acceso a miembros visibles. Por el contrario, mutable
requiere que el diseñador de la API ejerza un control preciso sobre las const
excepciones y, por lo general, estas excepciones están ocultas en los const
métodos que funcionan con datos privados.
(Nota: me refiero a la visibilidad de datos y métodos varias veces. Estoy hablando de miembros marcados como públicos frente a privados o protegidos, que es un tipo de protección de objetos totalmente diferente que se analiza aquí ).