La mutablepalabra clave es una forma de perforar el constvelo 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 constreferencia 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 mutableexcepció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 constmé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 mutableno destruya el constconcepto y solo se use en casos especiales útiles. La mutablepalabra clave ayuda porque marca claramente a los miembros de datos que están sujetos a estos casos especiales.
En la práctica, puede usarlo constobsesivamente 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 constcon 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 mutablepalabra clave, eventualmente se verá obligado a usar const_castpara manejar los diversos casos especiales útiles que permite (almacenamiento en caché, recuento de referencias, datos de depuración, etc.). Desafortunadamente, const_castes significativamente más destructivo que mutableporque obliga al cliente API a destruir la constprotección de los objetos que está utilizando. Además, causa una constdestrucción generalizada : el uso const_castde un puntero o referencia constante permite la escritura sin restricciones y el método de acceso a miembros visibles. Por el contrario, mutablerequiere que el diseñador de la API ejerza un control preciso sobre las constexcepciones y, por lo general, estas excepciones están ocultas en los constmé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í ).