मैं उन दो स्थितियों के बारे में सोच सकता हूं, जहां const_cast सुरक्षित और उपयोगी है (अन्य वैध मामले हो सकते हैं)।
एक तब होता है जब आपके पास एक कॉन्स्टेंट इंस्टेंस, रेफरेंस या पॉइंटर होता है, और आप एक पॉइंटर के लिए एक पॉइंटर या रेफरेंस पास करना चाहते हैं जो कॉन्स्टीट्यूशन सही न हो, लेकिन यह कि आप CERTAIN ऑब्जेक्ट को संशोधित नहीं करेंगे। आप पॉइंटर को संकुचित कर सकते हैं और इसे एपीआई में पास कर सकते हैं, यह विश्वास करते हुए कि यह वास्तव में कुछ भी नहीं बदलेगा। उदाहरण के लिए:
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()));
}
अन्य अगर आप एक पुराने संकलक का उपयोग कर रहे हैं, जो 'उत्परिवर्तित' को लागू नहीं करता है, और आप एक ऐसा वर्ग बनाना चाहते हैं जो तार्किक रूप से संकुचित हो लेकिन बिटवाइज़ कॉन्स्ट नहीं। आप एक कॉन्स्टीट्यूशन मे 'इस' को कास्ट कर सकते हैं और अपनी क्लास के सदस्यों को संशोधित कर सकते हैं।
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
वस्तु को deconst
-ed संदर्भ / पॉइंटर के माध्यम से संशोधित करने का प्रयास करते हैं, तो यह असुरक्षित हो जाता है । यदि, इसके बजाय, आप केवलconst_cast
खराब तरीके से (या, मेरे मामले में, आलसी होकर) API को काम करने के लिए निगलना चाहते हैं, जो केवल एक गैर-const
संदर्भ को स्वीकार करता है, लेकिन केवलconst
विधियों में उपयोग किया जाएगा ... कोई बात नहीं।