Я могу вспомнить две ситуации, когда const_cast безопасен и полезен (могут быть и другие допустимые случаи).
Один из них - когда у вас есть константный экземпляр, ссылка или указатель, и вы хотите передать указатель или ссылку на API, который не является константно-правильным, но вы НЕОБХОДИМО не будете изменять объект. Вы можете const_cast указатель и передать его API, полагая, что он ничего не изменит. Например:
void log(char* text);
void my_func(const std::string& message)
{
log(const_cast<char*>(&message.c_str()));
}
Другой - если вы используете более старый компилятор, который не реализует «изменяемый», и вы хотите создать класс, который является логически константным, но не побитовым. Вы можете const_cast 'this' внутри метода const и изменять члены вашего класса.
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
объект с помощью деформированнойconst
ссылки / указателя. Если вместо этого вы просто пытаетесьconst_cast
обойти плохо (или, в моем случае, лениво) специфицированный API, который принимает только не-const
ссылку, но будет использоваться только вconst
методах ... никаких проблем.