2013-02-17 30 views
6

मुझे यकीन नहीं है कि इससे पहले पूछा गया है, लेकिन मुझे विश्वास होना चाहिए था। प्रश्न की शुरुआत के लिए सरल रेखा पर विचार करें:static_cast कैसे int int को डाला जा सकता है लेकिन reinterpret_cast नहीं?

int a ; 
char b = reinterpret_cast<char> (a); 

मैं समझता हूँ reinterpret_cast प्रकार y के रूप में के प्रकार के एक्स बिट्स पैटर्न की व्याख्या, ofcouse यह आकार बेमेल की वजह से काम नहीं करना चाहिए और वास्तव में ऐसा नहीं है।

int a ; 
char b = static_cast<char> (a); 

यह काम करता है:

अब यह एक और कोड पर विचार! । अब मेरा सवाल यह है कि यह कैसे काम कर सकता है? मेरा मतलब है कि कंपाइलर बिट्स को बंद करता है? । मुझे यकीन है कि sizeof(char) < sizeof(int) है। यदि वह, reinterpret_cast भी एक ही तकनीक से काम करना चाहिए?

उत्तर

6

int से char से एक अच्छी तरह से परिभाषित रूपांतरण है; यही static_cast करता है। वास्तव में, आपको कलाकारों की आवश्यकता नहीं है; आप यहां एक असाइनमेंट का उपयोग कर सकते हैं। दूसरी तरफ, reinterpret_cast यह दिखाता है कि एक प्रकार की वस्तु में बिट्स किसी अन्य प्रकार की वस्तु का प्रतिनिधित्व करते हैं; कुछ प्रकार के लिए जो ठीक है (अधिक या कम), लेकिन यह दिखाने का कोई समझदार तरीका नहीं है कि एक int में बिट्स को एक रूपांतरण में लागू किए बिना चार में बिट्स के रूप में उपयोग किया जा सकता है, और reinterpret_cast ऐसा नहीं करता है।

+0

* "... और' reinterpret_cast' ऐसा नहीं करता "*। कल्पना का कौन सा हिस्सा कहता है? – Nawaz

+4

@ नवाज, वह हिस्सा जो 'reinterpret_cast' द्वारा अनुमत रूपांतरणों को परिभाषित करता है, जाहिर है, आप इसे कहने की अपेक्षा कहां से कहां रखते हैं? [expr.reinterpret.cast] "रूपांतरण जो 'reinterpret_cast' का उपयोग करके स्पष्ट रूप से निष्पादित किए जा सकते हैं नीचे सूचीबद्ध हैं। ** नहीं अन्य रूपांतरण' reinterpret_cast' का उपयोग करके स्पष्ट रूप से किया जा सकता है। **" –

+0

इसके नाम की प्रतीत होने वाली चौड़ाई के बावजूद, ' reinterpret_cast' काफी सीमित है। जैसा कि @ जोनाथन वाकई बताते हैं, वहां कुछ चीजें हैं जो यह कर सकती हैं (मूल रूप से पॉइंटर्स और संदर्भों से संबंधित चीजें) और कुछ भी अनुमति नहीं है। 5.2.10 [expr.reinterpret.cast]। सी-स्टाइल कास्ट की तरह बिल्कुल नहीं ... –

3

static_cast या तो परिभाषित रूपांतरण को मजबूर कर सकता है या यह परिभाषित रूपांतरण को उलट सकता है (कॉन्स्ट/अस्थिरता को जोड़ने या हटाने के अलावा)। आपको लगता है कि reinterpret_cast कुछ सुपर कास्ट है जो कुछ भी कर सकता है। बात वह नहीं है। इसमें परिभाषित रूपांतरणों का एक सेट है।

यह एक प्रकार के पॉइंटर्स को दूसरे के पॉइंटर में परिवर्तित कर सकता है (जब तक कॉन्स/अस्थिर संरक्षित किया जाता है)। यह संदर्भों के लिए भी ऐसा ही कर सकता है। यह पॉइंटर्स को अभिन्न प्रकारों और इसके विपरीत बना सकता है।

इसके अलावा, यह कुछ भी नहीं करता है और आपका प्रोग्राम अच्छी तरह से गठित नहीं है।