Je peux penser à deux situations où const_cast est sûr et utile (il peut y avoir d'autres cas valides).
La première est lorsque vous avez une instance, une référence ou un pointeur const, et que vous souhaitez passer un pointeur ou une référence à une API qui n'est pas constante, mais que vous êtes CERTAIN que vous ne modifiez pas l'objet. Vous pouvez const_cast le pointeur et le transmettre à l'API, en sachant que cela ne changera vraiment rien. Par exemple:
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()));
}
L'autre est si vous utilisez un compilateur plus ancien qui n'implémente pas «mutable» et que vous souhaitez créer une classe qui est logiquement const mais pas au niveau du bit. Vous pouvez const_cast 'this' dans une méthode const et modifier les membres de votre classe.
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];
}
};
const
objet d' origine via uneconst
référence / un pointeur dé- dé- . Si, à la place, vous ne faites queconst_cast
contourner une API mal spécifiée (ou, dans mon cas, paresseuse) qui n'accepte qu'une non-const
référence mais qui ne sera utilisée que dans desconst
méthodes ... aucun problème.