2016-08-29 3 views
13

यह प्रश्न C12+ spec में मैंने जो कुछ देखा है, उससे संबंधित है जब मैं this earlier, intriguing question about C-style casts and type conversions का उत्तर देने का प्रयास कर रहा था।क्या सी ++ विनिर्देश कहता है कि सी-स्टाइल कास्ट में इस्तेमाल होने के लिए static_cast/const_cast श्रृंखला में प्रकार कैसे चुने जाते हैं?

सी ++ स्पेक सी-शैली के बारे में वार्ता § 5.4 में है। इसमें कहा गया है कि कलाकारों के अंकन निम्नलिखित डाले जब तक कोई मिलता है, जो मान्य है की कोशिश करेंगे, इसी क्रम में,:

  • const_cast
  • static_cast
  • static_cast पीछा const_cast
  • reinterpret_cast
  • reinterpret_cast द्वारा const_cast के बाद।

मैं क्या यह एक static_cast एक const_cast के बाद का उपयोग करने का मतलब है की एक महान सहज ज्ञान युक्त विचार है जबकि (उदाहरण के लिए, एक const_cast<Base*>(static_cast<const Base*>(expr)) माध्यम से जा रहा द्वारा एक Base* करने के लिए एक const Derived* कन्वर्ट करने के लिए), मैं किसी शब्द को नहीं देख पा spec में यह कहकर, विशेष रूप से, static_cast/const_cast श्रृंखला में उपयोग किए जाने वाले प्रकारों को कैसे निकाला जाना है। सरल पॉइंटर्स के मामले में यह मुश्किल नहीं है, लेकिन जैसा कि लिंक किए गए प्रश्न में देखा गया है, यदि एक अतिरिक्त const एक स्थान पर पेश किया गया है और दूसरे में हटा दिया गया है तो कलाकार सफल हो सकता है।

क्या कोई नियम नियंत्रित करता है कि एक कंपाइलर को यह निर्धारित करना चाहिए कि कास्टिंग श्रृंखला में किस प्रकार का उपयोग करना है? यदि हां, तो वे कहाँ हैं? यदि नहीं, तो क्या यह भाषा में एक दोष है, या क्या संभवतः सभी संभावित स्थानों को निर्धारित करने के लिए पर्याप्त निहित नियम हैं?

उत्तर

3

यदि नहीं, तो क्या यह भाषा में एक दोष है, या क्या सभी संभावित जानवरों को विशिष्ट रूप से निर्धारित करने के लिए पर्याप्त निहित नियम हैं?

केवल const_cast का उपयोग करके लक्ष्य प्रकार पर डाले जा सकने वाले सभी प्रकारों के निर्माण के बारे में क्या, यानी सभी "मध्यवर्ती प्रकार"?

को देखते हुए लक्ष्य प्रकार T, अगर static_cast, काम नहीं करता है सभी पदों की पहचान जहां एक सीवी-क्वालिफायर ऐसी है कि जिसके परिणामस्वरूप प्रकार const_cast द्वारा T वापस करने के लिए डाली जा सकती है, जोड़ सकते हैं। एल्गोरिदम का स्केच: T के सीवी-अपघटन ([conv.qual]/1) लें; प्रत्येक सीवी जे बढ़ाया जा सकता है। यदि T एक संदर्भ है, तो हम रेफरी प्रकार की सीवी-योग्यता बढ़ा सकते हैं।

अब इन सभी स्थानों पर const volatile जोड़ें। परिणामी प्रकार CT पर कॉल करें। static_cast को अभिव्यक्ति में CT पर आज़माएं। यदि यह काम करता है, तो हमारी कास्ट श्रृंखला const_cast<T>(static_cast<CT>()) है।

यदि यह काम नहीं करता है, तो शायद static_cast का उपयोग करके कोई रूपांतरण नहीं है, इसके बाद const_cast (मैंने ओवरलोड रिज़ॉल्यूशन के गहरे कोनों में नहीं पहुंचाया है (ठीक है मेरे पास है, लेकिन इस प्रश्न के लिए नहीं))।लेकिन हम const/volatile एस को बार-बार हटाने के लिए ब्रूट फोर्स का उपयोग कर सकते हैं और यदि हम वास्तव में चाहते थे तो प्रत्येक प्रकार की जांच करें। तो सिद्धांत रूप में, कोई अस्पष्टता या अनावश्यकता नहीं है; अगर कुछ कास्ट चेन है, तो इसे निर्धारित किया जा सकता है। अभ्यास में, एल्गोरिदम को बहुत सरल बनाया जा सकता है, क्योंकि "सबसे सीवी-योग्य" प्रकार हम T से बना सकते हैं (निश्चित रूप से) पर्याप्त है।

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

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