Tôi có thể nghĩ đến hai tình huống mà const_cast an toàn và hữu ích (có thể có những trường hợp hợp lệ khác).
Một là khi bạn có một cá thể, tham chiếu hoặc con trỏ const và bạn muốn chuyển một con trỏ hoặc tham chiếu đến một API không đúng hằng số, nhưng bạn CHẮC CHẮN sẽ không sửa đổi đối tượng. Bạn có thể const_cast con trỏ và chuyển nó đến API, tin tưởng rằng nó sẽ không thực sự thay đổi bất cứ điều gì. Ví dụ:
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()));
}
Trường hợp khác là nếu bạn đang sử dụng trình biên dịch cũ hơn không triển khai 'có thể thay đổi' và bạn muốn tạo một lớp theo logic const nhưng không phải const bit. Bạn có thể const_cast 'this' trong một phương thức const và sửa đổi các thành viên trong lớp của bạn.
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
đối tượng ban đầu thông qua mộtconst
tham chiếu / con trỏ de -ed. Thay vào đó, nếu bạn chỉ đơn thuầnconst_cast
làm việc xung quanh một API chỉ định kém (hoặc, trong trường hợp của tôi là lười biếng) chỉ chấp nhận mộtconst
tham chiếu không phải là tham chiếu nhưng sẽ chỉ được sử dụng trongconst
các phương thức ... không vấn đề gì.