Przychodzą mi do głowy dwie sytuacje, w których const_cast jest bezpieczne i przydatne (mogą istnieć inne ważne przypadki).
Jeden z nich to sytuacja, w której masz instancję stałej, odwołanie lub wskaźnik i chcesz przekazać wskaźnik lub odwołanie do interfejsu API, który nie jest zgodny ze stałą stałą, ale jesteś PEWNY, że nie zmodyfikujesz obiektu. Możesz const_cast wskaźnik i przekazać go do API, ufając, że tak naprawdę niczego nie zmieni. Na przykład:
void log(char* text);
void my_func(const std::string& message)
{
log(const_cast<char*>(&message.c_str()));
}
Druga to sytuacja, gdy używasz starszego kompilatora, który nie implementuje opcji „mutable” i chcesz utworzyć klasę, która jest logicznie stała, ale nie bitowa. Możesz const_cast „this” w ramach metody const i modyfikować członków swojej klasy.
class MyClass
{
char cached_data[10000];
bool cache_dirty;
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
obiekt za pomocąconst
usuniętego odniesienia / wskaźnika. Jeśli zamiast tego po prostuconst_cast
obejdziesz słabo (lub, w moim przypadku, leniwie) interfejs API, który akceptuje tylko brakconst
odniesienia, ale będzie używany tylko wconst
metodach ... nie ma żadnego problemu.