const_cast
किसी ऑब्जेक्ट की स्थिरता को रद्द नहीं कर सकता है। const_cast
किसी ऑब्जेक्ट में केवल पहुंच पथ से स्थिरता को हटा सकता है। एक्सेस पथ एक पॉइंटर या ऑब्जेक्ट का संदर्भ है। एक्सेस पथ से स्थिरता को हटाने से ऑब्जेक्ट पर बिल्कुल कोई प्रभाव नहीं पड़ता है। भले ही आप एक्सेस पथ की स्थिरता को हटाने के लिए const_cast
का उपयोग करें, फिर भी यह आपको ऑब्जेक्ट को संशोधित करने की अनुमति नहीं देता है। चाहे आप इसे कर सकें या फिर भी ऑब्जेक्ट पर निर्भर न हों। यदि यह स्थिर है, तो आपको इसे संशोधित करने की अनुमति नहीं है और ऐसा करने के किसी भी प्रयास के परिणामस्वरूप अपरिभाषित व्यवहार होगा।
उदाहरण के लिए, इस const_cast
int i = 5; // non-constant object
const int *p = &i; // `p` is a const access path to `i`
// Since we know that `i` is not a const, we can remove constness...
int *q = const_cast<int *>(p);
// ... and legally modify `i`
*q = 10;
// Now `i` is 10
एकमात्र कारण ऊपर कानूनी और वैध है की अभीष्ट उपयोग दिखाता है तथ्य यह है कि i
वास्तव में एक गैर निरंतर वस्तु है, और हम इस बारे में पता है ।
यदि मूल वस्तु वास्तव में निरंतर था, तो इसके बाद के संस्करण कोड अपरिभाषित व्यवहार का उत्पादन होगा:
const int j = 5; // constant object
const int *p = &j; // `p` is a const access path to `j`
int *q = const_cast<int *>(p); // `q` is a non-const access path to `j`
*q = 10; // UNDEFINED BEHAVIOR !!!
C++ भाषा आप लगातार वस्तुओं को संशोधित करने की अनुमति नहीं है और const_cast
यहां पूरी तरह से शक्तिहीन है, तो आप कैसे उपयोग की परवाह किए बिना यह।
mutable
एक पूरी तरह से अलग बात है। mutable
दायर एक डेटा बनाता है जिसे कानूनी रूप से संशोधित किया जा सकता है भले ही युक्त ऑब्जेक्ट const
घोषित किया गया हो। उस अर्थ में mutable
आपको निरंतर वस्तुओं के कुछ निर्दिष्ट भागों को संशोधित करने की अनुमति देता है। दूसरी ओर, const_cast
, ऐसा कुछ भी नहीं कर सकता है।