Hablaré con C ++, donde esta diferencia es más relevante.
Como observa correctamente, inmutable significa que un objeto no puede cambiar en absoluto después de su creación. Por supuesto, esta creación puede ocurrir en tiempo de ejecución, es decir, un constobjeto no es necesariamente una constante de tiempo de compilación. En C ++, un objeto es inmutable si se cumplen (1) y (2) o (3):
No tiene miembros declarados mutableque estén mutados por constfunciones miembro
Se declara const
constlas funciones de miembro no se utilizan const_castpara eliminar la constcalificación con el fin de mutar a cualquier miembro
Sin embargo, también podría considerar modificadores de acceso: si una operación muta internamente una instancia, pero no tiene ningún efecto sobre el estado de la instancia observable a través de su interfaz pública, entonces el objeto es "lógicamente inmutable".
Por lo tanto, C ++ proporciona las herramientas necesarias para crear objetos inmutables, pero como la mayoría de todo en C ++, las herramientas son mínimamente suficientes y requieren diligencia para su uso real. El estado de una instancia no se limita necesariamente a las variables miembro de la instancia, ya que C ++ no proporciona una forma de imponer la transparencia referencial, también puede incluir el estado global o de clase.
constTambién tiene otra función en C ++: calificar referencias y punteros. Una constreferencia puede referirse a un no constobjeto. Es legal (aunque generalmente no es necesario o aconsejable) usar const_castpara mutar un objeto a través de una constreferencia, si y solo si ese objeto se declara no const:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
Y, por supuesto, es un comportamiento indefinido mutar un constobjeto:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
constno existe en todos los idiomas, y la mutabilidad e inmutabilidad no existe en todos los idiomas, por lo que hacer que este lenguaje sea agonístico no es aplicable. Es específico del idioma solo donde se aplican estos conceptos.