Я можу подумати про дві ситуації, коли const_cast є безпечним та корисним (можуть бути й інші дійсні випадки).
Одне - це коли у вас є екземпляр const, посилання або вказівник, і ви хочете передати вказівник або посилання на API, який не є правильним для const, але що ви ЗАЯВКИ не зміните об’єкт. Ви можете 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. Ви можете 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];
}
};
const
об'єкт за допомогоюconst
відміченого посилання / покажчика. Якщо замість цього ви простоconst_cast
намагаєтеся обійти погано (або, у моєму випадку, ліниво) специфікований API, який приймає лише неconst
посилання, але буде використовуватися лише вconst
методах ... жодної проблеми.