Я могу думать о двух ситуациях, когда const_cast безопасен и полезен (могут быть и другие действительные случаи).
Один из них, когда у вас есть экземпляр const, ссылка или указатель, и вы хотите передать указатель или ссылку на API, который не является const-правильным, но вы CERTAIN не будете изменять объект. Вы можете const_cast указатель и передать его API, полагая, что это ничего не изменит. Например:
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()));
}
Другой, если вы используете старый компилятор, который не реализует «изменчивым», и вы хотите создать класс, который является логически Const, но не побитовое сопзЬ.Вы можете const_cast 'this' внутри метода const и изменять членов вашего класса.
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];
}
};
Верхний ответ выходит что-то, что может быть ужасно очевидным, но стоит заявив: Это только становится небезопасным _If вы пытаетесь изменить первоначально `const` object_ через де-`const` -ed reference/pointer. Если вместо этого вы просто `const_cast`, чтобы работать с плохой (или, в моем случае, лениво) spec'd API, который принимает только ссылку, отличную от `const`, но будет использоваться только в` const` методах ... никаких проблем. – 2015-12-22 01:39:30