2008-12-16 15 views
7

डाले क्यों निम्नलिखित ?:सी ++ const_cast उपयोग

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 
+0

क्या आप संकलक से त्रुटि संदेश जोड़ सकते हैं? –

+0

टाइप 'int' के साथ const_cast का अमान्य उपयोग, जो सूचक नहीं है, संदर्भ, न ही पॉइंटर-टू-डेटा-सदस्य प्रकार टाइप 'कॉन्स्ट इंट' के साथ const_cast का अमान्य उपयोग, जो पॉइंटर नहीं है, संदर्भ, न ही एक पॉइंटर-टू-डेटा-सदस्य प्रकार –

उत्तर

0

पहले त्रुटि के लिए है। const_cast केवल पॉइंटर या संदर्भ प्रकारों पर उपयोग किया जा सकता है। "int" न तो है। यह सी ++ मानक हो सकता है या नहीं हो सकता है (एक अच्छा संदर्भ नहीं मिला)। लेकिन एमएस के सी ++ कंपाइलर जैसे कुछ कार्यान्वयन के मामले में यह मामला है।

दूसरी त्रुटि के लिए। const_cast का उपयोग केवल एक कॉन्स या अस्थिर क्वालीफायर को हटाने के लिए किया जा सकता है, इसे जोड़ना नहीं।

संदर्भ: http://msdn.microsoft.com/en-us/library/bz6at95h(VS.80).aspx

+1

const_cast ऑपरेटर (केवल C++) एक const_cast ऑपरेटर का उपयोग किसी प्रकार से या किसी प्रकार से कॉन्स्ट या अस्थिर संशोधक को जोड़ने या निकालने के लिए किया जाता है। से: http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/language_ref/keyword_const_cast.htm –

20
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! 

ऊपर, अपरिभाषित व्यवहार हो सकता है जब आप गैर-स्थिरांक (वास्तव में, केवल कास्टिंग और इसे पढ़ने के लिए एक संदर्भ के माध्यम से एक मूल रूप से स्थिरांक वस्तु को लिखने अपरिभाषित नहीं है: अब क्या तुम सच में संग्रह करने के लिए करना चाहता था खुद में व्यवहार। लेकिन यदि आप इसे कास्ट कर रहे हैं, तो आप इसे भी लिख सकते हैं, जो तब अनिर्धारित व्यवहार उत्पन्न करता है)

+0

क्या यह वास्तव में केवल अपरिभाषित व्यवहार है एक कॉन्स ऑब्जेक्ट का एक गैर-कॉन्स्ट संदर्भ है?मैंने सोचा कि आपको वास्तव में इसे संशोधित करने का प्रयास करना था। आप उदाहरण i2 तक बिल्कुल नहीं पहुंचते हैं; यह सिर्फ इसे परिभाषित करता है। –

+0

क्या ऐसी कोई परिस्थितियां हैं जहां सी-स्टाइल कास्ट (int) से (const int) या (const int) से (int) तक का उपयोग उपयोगी होगा, क्योंकि const_cast और const_cast की अनुमति नहीं है? –

+0

केनी, कोई परिस्थिति नहीं है। बिल्टिन प्रकार के निरंतर अंतराल नहीं हैं। इसलिए वे या तो अवैध होंगे, या "int" के समान ही होंगे (मानक कहता है कि इस पर निर्भर करता है, वर्तमान में स्कूल में आईएम नहीं देखा है) –

5

यह एक त्रुटि है क्योंकि मानक कहता है कि इसकी अनुमति नहीं है। मानक const_cast को करने की अनुमति देने वाले रूपांतरणों के प्रकारों की गणना करता है, और यह सूची में मौजूद कुछ भी अस्वीकार नहीं करता है। यह निम्न अनुमति देता है:

  • प्वाइंटर
  • संदर्भ
  • सदस्य-संकेत

के बाद से अपने प्रकार उन लोगों में से किसी भी नहीं हैं, वे अनुमति नहीं है।

चमकदार तरफ, आपके द्वारा दिए गए उदाहरण const_cast की आवश्यकता नहीं है।