const int i0 = 5;
//int i1 = const_cast<int>(i0); // compilation error
int i2 = (int)i0; // okay
int i3 = 5;
//const int i4 = const_cast<const int>(i3); // compilation error
const int i5 = (const int)i3; // okay
संकलन त्रुटियों के कारण होता है क्योंकि आप स्थिरांक दूर डाली नहीं है/स्थिरांक जोड़ें। इसके बजाय, आप i0 कॉपी करते हैं। उस ऑपरेशन के लिए, कोई भी कलाकार आवश्यक नहीं है:
int i1 = i0;
const int i4 = i3;
आपके द्वारा डाला जाने वाला प्रकार वास्तव में एक सूचक या संदर्भ होना चाहिए। अन्यथा, const_cast का उपयोग करना समझ में नहीं आता है क्योंकि आप इसे सीधे कॉपी कर सकते हैं। पॉइंटर्स के लिए, उदाहरण के लिए, आप कॉन्स को दूर कर सकते हैं, क्योंकि पॉइंटर को डिफ्रेंस करने से const T*
(const T
उत्पन्न होता है) T*
(उपज T
) के मुकाबले एक और प्रकार का उत्पादन करेगा। संदर्भों के लिए, यह भी सच है: T&
का उपयोग करने से सूचक प्रकार का उपयोग करके ऑब्जेक्ट तक पहुंच जाएगा।
const int i0 = 5;
//int & i1 = const_cast<int&>(i0); // okay (but dangerous)
int & i2 = (int&)i0; // okay (but dangerous)
int i3 = 5;
//const int&i4 = const_cast<const int&>(i3); // ok now and valid!
const int&i5 = (const int&)i3; // okay too!
ऊपर, अपरिभाषित व्यवहार हो सकता है जब आप गैर-स्थिरांक (वास्तव में, केवल कास्टिंग और इसे पढ़ने के लिए एक संदर्भ के माध्यम से एक मूल रूप से स्थिरांक वस्तु को लिखने अपरिभाषित नहीं है: अब क्या तुम सच में संग्रह करने के लिए करना चाहता था खुद में व्यवहार। लेकिन यदि आप इसे कास्ट कर रहे हैं, तो आप इसे भी लिख सकते हैं, जो तब अनिर्धारित व्यवहार उत्पन्न करता है)
स्रोत
2008-12-16 06:36:12
क्या आप संकलक से त्रुटि संदेश जोड़ सकते हैं? –
टाइप 'int' के साथ const_cast का अमान्य उपयोग, जो सूचक नहीं है, संदर्भ, न ही पॉइंटर-टू-डेटा-सदस्य प्रकार टाइप 'कॉन्स्ट इंट' के साथ const_cast का अमान्य उपयोग, जो पॉइंटर नहीं है, संदर्भ, न ही एक पॉइंटर-टू-डेटा-सदस्य प्रकार –