2012-09-05 17 views
9

इस रूपांतरण सुरक्षितपॉइंटर्स के वेक्टर से कास्ट पॉइंटर्स के वेक्टर तक कास्ट पुन: परिभाषित किया गया है?

vector<int*> a; 
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a); 

एक स्थिर डाली स्पष्ट रूप से काम नहीं करता है इस मामले में प्रकार क्योंकि टेम्पलेट तर्क बदल रहा है है। लेकिन इसे कास्ट करके दोबारा डालने के द्वारा, मैं केवल उसी प्रकार के लिए स्थिरता जोड़ रहा हूं। तो क्या यह सभी व्यावहारिक उद्देश्यों के लिए सुरक्षित होना चाहिए?

+2

एक तरीका यह है कि यह वास्तविक रूप से गलत हो सकता है (हालांकि मैंने परीक्षण द्वारा इसकी पुष्टि नहीं की है) सख्त अलियासिंग है। ऑप्टिमाइज़र यह मानने का हकदार है कि 'बी' उसी स्मृति को 'ए' के ​​रूप में संदर्भित नहीं करता है (क्योंकि इसमें एक प्रकार है जो एलियासिंग के लिए संगत नहीं है)। फिर ऑप्टिमाइज़र अपनी चाल चलाएगा, और आपको लगता है कि यह चीजों को फिर से ऑर्डर या एलिइड करता है कि अगर वह 'ए' और' बी '* वैध रूप से * उसी स्मृति को संदर्भित करता है तो वह फिर से ऑर्डर या एलिइड नहीं करेगा। तो, समान लेआउट एक आवश्यक है लेकिन इसके लिए "काम" करने के लिए पर्याप्त शर्त नहीं है। –

+1

इसे देखने का एक और तरीका यह है कि किसी संदर्भ या सूचक प्रकार के लिए 'reinterpret_cast' का परिणाम * मौलिक रूप से * बेकार है और मूल प्रकार में परिवर्तित करने के अलावा किसी अन्य चीज़ के लिए काम नहीं करता है, जब तक कि (ए) गंतव्य प्रकार वस्तु के वास्तविक प्रकार को अलियासिंग के लिए कानूनी है, या (बी) आपके पास अपने कार्यान्वयन से कुछ विशेष आश्वासन है कि यह आपके द्वारा की जा रही विशिष्ट चीज़ का समर्थन करता है। जब कोई भी लागू नहीं होता है, तो किसी ऑब्जेक्ट को किसी अन्य प्रकार के माध्यम से संदर्भित न करें। ऐसा करने के लिए "टाइप-पनिंग" भी कहा जाता है। –

उत्तर

7

किसी असंबद्ध प्रकार के संदर्भ को बदलने के लिए reinterpret_cast के किसी भी उपयोग की तरह, यह अपरिभाषित व्यवहार प्रदान करता है, और तब तक सुरक्षित नहीं है जब तक कि आप "मेरे कंपाइलर पर काम" करने के लिए "सुरक्षित" परिभाषित नहीं करते हैं।

+0

यह मानना ​​ठीक नहीं होगा कि किसी भी पॉइंटर के वेक्टर के पास एक ही संरचना है, जिसके बाद वे केवल पते हैं। या सूचक सूचक वास्तव में सूचक के प्रकार के कारण बदल सकते हैं। – user1353535

+3

@ user1353535: नहीं, लाइब्रेरी कार्यान्वयन टेम्पलेट को विशेषज्ञ करने के लिए स्वतंत्र है, हालांकि इसे पसंद है। विभिन्न विशेषज्ञता के लिए लेआउट-संगत होने की आवश्यकता नहीं है। –

+0

तो यदि इसका उपयोगकर्ता परिभाषित प्रकार है जो लाइब्रेरी संभवतः विशेषज्ञ नहीं कर सकता है, तो? – user1353535

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