2013-01-11 19 views
6

एसओ सी ++ एफएक्यू When should static_cast, dynamic_cast and reinterpret_cast be used? का जिक्र करते हुए।const_cast बनाम reinterpret_cast

const_cast का उपयोग एक चर को हटाने या जोड़ने के लिए किया जाता है और यह स्थिरता को हटाने के लिए एकमात्र विश्वसनीय, परिभाषित और कानूनी तरीका है। reinterpret_cast का उपयोग किसी प्रकार की व्याख्या को बदलने के लिए किया जाता है।

मैं एक उचित तरीके से समझता हूं, क्यों एक कॉन्स्ट चर को केवल const_cast का उपयोग करके गैर-कॉन्स्ट में डाला जाना चाहिए, लेकिन मैं स्थिरता जोड़ने के लिए const_cast के बजाय reinterpret_cast का उपयोग करके समस्याओं का उचित औचित्य नहीं समझ सकता।

मैं समझता हूं कि स्थिरता जोड़ने के लिए reinterpret_cast का उपयोग करना भी नहीं है, लेकिन यह स्थिरता जोड़ने के लिए reinterpret_cast का उपयोग करने के लिए एक यूबी या संभावित समय बम होगा?

कारण मैं यहाँ उलझन में था बयान की वजह से है

मोटे तौर पर, केवल गारंटी आप reinterpret_cast के साथ मिलता है कि अगर आप मूल प्रकार पर वापस परिणाम डाली, आप सटीक मिल जाएगा एक ही मूल्य

तो अगर मैं constness reinterpret_cast का उपयोग कर और यदि आप परिणाम वापस मूल प्रकार के reinterpret_cast, इसे वापस मूल प्रकार के परिणाम चाहिए और यूबी नहीं होना चाहिए, लेकिन यह है कि तथ्य यह है कि एक ही const_cast का उपयोग करना चाहिए का उल्लंघन करती है जोड़ने constness दूर करने के लिए

एक अलग नोट पर, मानक की गारंटी देता है आप constness का उपयोग कर पुनर्व्याख्या मामले

5.2.10 पुनर्व्याख्या डाली (7) ...... जब प्रकार का एक prvalue वी जोड़ सकते हैं कि "पॉइंटर टू टी 1" को "पॉइंटर से सीवी टी 2" में परिवर्तित किया गया है, परिणामहैstatic_cast (static_cast (v)) अगर दोनों T1 और टी 2 मानक लेआउट प्रकार (3.9) और टी 2 के संरेखण आवश्यकताएँ हैं कोई टी 1 के से अधिक सख्त हैं ........

+0

@clossvoters: क्या आप कृपया मुझे डुप्लिकेट प्रश्न का संदर्भ दे सकते हैं जो इसका उत्तर देता है? – Abhijit

+1

'const_cast' में' अस्थिर 'के अतिरिक्त/हटाने को भी शामिल किया गया है। –

+0

@ माइकडे सिमोन: हां निश्चित रूप से, लेकिन मेरा वर्तमान फोकस केवल स्थिरता है – Abhijit

उत्तर

9

reinterpret_cast ऑब्जेक्ट के भीतर डेटा की व्याख्या को बदलता है। const_castconst क्वालीफायर जोड़ता है या हटा देता है। डेटा प्रतिनिधित्व और स्थिरता ऑर्थोगोनल हैं। तो यह अलग-अलग कलाकारों के लिए समझ में आता है।

तो अगर मैं constness reinterpret_cast का उपयोग कर और यदि आप परिणाम वापस मूल प्रकार के reinterpret_cast, इसे वापस मूल प्रकार के परिणाम चाहिए और यूबी नहीं होना चाहिए, लेकिन यह है कि तथ्य यह है कि एक ही const_cast का उपयोग करना चाहिए का उल्लंघन करती है जोड़ने constness

कि यहां तक ​​कि संकलन नहीं होगा दूर करने के लिए:

int * n = new int; 
const * const_added = reinterpret_cast<const int *>(n); 
int * original_type = reinterpret_cast<int*>(const_added); 
    // error: reinterpret_cast from type ‘const int*’ to type ‘int*’ casts away qualifiers 
+1

देखें '5.2.10 कास्ट करें' : 'जब "पॉइंटर टू टी 1" के प्रकार का प्रचलन बनाम "पॉइंटर टू सी 1 टी 2" में परिवर्तित हो जाता है, तो परिणाम static_cast (static_cast (v)) यदि टी 1 और टी 2 दोनों मानक हैं - प्रकार के प्रकार (3.9) और संरेखण टी 2 की आवश्यकताओं T1.' की तुलना में कोई कठोर नहीं है। तो ऐसा लगता है कि आप कास्ट reinterpret का उपयोग कर स्थिरता जोड़ सकते हैं। – Abhijit

+1

गैर-कॉन्स ऑब्जेक्ट्स को हमेशा किसी भी कलाकार को बिना किसी कण की आवश्यकता के निहित रूप में परिवर्तित किया जा सकता है।मुझे नहीं लगता कि इस नियम के लिए 'reinterpret_cast' अपवाद क्यों होना चाहिए। – StackedCrooked

3

आप सिर्फसाथ const जोड़ने नहीं होना चाहिए 10। एक reinterpret_cast मुख्य रूप से होना चाहिए: सूचक (या जो कुछ भी) को दोहराएं।

दूसरे शब्दों में, यदि आप const char* से char* (उम्मीद है क्योंकि एक बुरा एपीआई है जिसे आप नहीं बदल सकते हैं), तो const_cast आपका मित्र है। वास्तव में यह सब होना है।

लेकिन अगर आप MyPODType* से const char* जाने की जरूरत है, तो आप reinterpret_cast की जरूरत है, और यह सिर्फ यह की चोटी पर एक const_cast की जरूरत नहीं द्वारा अच्छा किया जा रहा है।

0

केवल जगह है जहाँ मैं स्थिरांक सत्ता के साथ reinterpret_cast संबंधित के लिए के बारे में सोच सकते हैं जब एक API कि एक शून्य सूचक को स्वीकार करता है करने के लिए एक स्थिरांक वस्तु गुजर है -

UINT ThreadFunction(void* param) 
{ 
    const MyClass* ptr = reinterpret_cast<const MyClass*>(param); 
} 
1

को ध्यान में रखना एक चीज नहीं है: const परिवर्तनीय लिखने योग्य बनाने के लिए आप const_cast का उपयोग नहीं कर सकते। यदि आप कॉन्स्ट संदर्भ एक गैर-कॉन्स्ट ऑब्जेक्ट को संदर्भित करते हैं तो आप केवल एक कॉन्स्ट संदर्भ से गैर-कॉन्स्ट संदर्भ पुनर्प्राप्त करने के लिए इसका उपयोग कर सकते हैं। जटिल लगता है? उदाहरण:

// valid: 
int x; 
int const& x1 = x; 
const_cast<int&>(x1) = 0; 
// invalid: 
int const y = 42; 
int const& y1 = y; 
const_cast<int&>(y1) = 0; 

असल में, ये दोनों संकलित और कभी-कभी "काम" भी करेंगे। हालांकि, दूसरा अपरिभाषित व्यवहार का कारण बनता है और कई मामलों में प्रोग्राम को समाप्त कर दिया जाएगा जब निरंतर वस्तु केवल पढ़ने योग्य स्मृति में रखी जाती है।

उसने कहा, कुछ और चीजें: reinterpret_cast सबसे शक्तिशाली कलाकार है, लेकिन सबसे खतरनाक भी है, इसलिए इसे तब तक उपयोग न करें जब तक आपको यह नहीं करना पड़े। जब आपको void* से sometype* पर जाने की आवश्यकता है, तो static_cast का उपयोग करें। विपरीत दिशा में जाने पर, अंतर्निहित अंतर्निहित रूपांतरण का उपयोग करें या एक स्पष्ट static_cast का भी उपयोग करें। इसी तरह const जोड़ने या हटाने के साथ, जो भी अंतर्निहित रूप से जोड़ा जाता है। reinterpret_cast के बारे में, C++ When should we prefer to use a two chained static_cast over reinterpret_cast पर भी चर्चा देखें जहां एक विकल्प है जो कम हैकिश पर चर्चा की जाती है।

उली

0

हाँ, जैसा कि आप जानते, const_cast मतलब है कि यह एक विशेष प्रकार से constness निकाल देता है।

लेकिन, जब हमें किसी प्रकार में स्थिरता जोड़ने की आवश्यकता होती है। क्या ऐसा कोई कारण है जिसे हमें करना है?

उदाहरण के लिए

,

void PrintAnything(void* pData) 
{ 
    const CObject* pObject = reinterpret_cast<CObject*>(pData); 
    // below is bla-bla-bla. 
} 

reinterpret_cast 'स्थिरांक' के साथ कोई संबंध नहीं है।

const_cast का मतलब दो चीजें हैं। पहला एक प्रकार से स्थिरता को दूर करना है और दूसरा इसका कोड स्पष्टीकरण देना है। क्योंकि आप इसे सी-स्टाइल कास्ट का उपयोग करके कास्ट कर सकते हैं, लेकिन यह स्पष्ट नहीं है कि इसकी अनुशंसा नहीं की जाती है।

वे समान कार्य नहीं करते हैं। यह निश्चित रूप से अलग है।

संबंधित मुद्दे