Puedo pensar en dos situaciones donde const_cast es seguro y útil (puede haber otros casos válidos).
Una es cuando tiene una instancia, referencia o puntero const, y desea pasar un puntero o referencia a una API que no es const-correcto, pero que está CERTE que no modificará el objeto. Puede const_cast el puntero y pasarlo a la API, confiando en que realmente no cambiará nada. Por ejemplo:
void log(char* text); // Won't change text -- just const-incorrect
void my_func(const std::string& message)
{
log(const_cast<char*>(&message.c_str()));
}
La otra es que si estás usando un compilador de más edad que no implementa 'mutable', y que desea crear una clase que es, lógicamente, pero no const const bit a bit.Puede const_cast 'this' dentro de un método const y modificar miembros de su clase.
class MyClass
{
char cached_data[10000]; // should be mutable
bool cache_dirty; // should also be mutable
public:
char getData(int index) const
{
if (cache_dirty)
{
MyClass* thisptr = const_cast<MyClass*>(this);
update_cache(thisptr->cached_data);
}
return cached_data[index];
}
};
La respuesta superior con vistas a algo que podría ser terriblemente obvio, pero merece la pena señalar: Sólo se vuelve insegura _Si se intenta modificar un originalmente 'const' object_ a través de un de-'const' referencia/puntero. Si, en cambio, simplemente estás 'const_cast'ing para trabajar con una API mal especificada (o, en mi caso, perezosamente) que solo acepta una referencia que no sea' 'pero '' solo se usará en los métodos' const' ... No hay problema en lo absoluto. –