यह प्रश्न 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
एक स्थान पर पेश किया गया है और दूसरे में हटा दिया गया है तो कलाकार सफल हो सकता है।
क्या कोई नियम नियंत्रित करता है कि एक कंपाइलर को यह निर्धारित करना चाहिए कि कास्टिंग श्रृंखला में किस प्रकार का उपयोग करना है? यदि हां, तो वे कहाँ हैं? यदि नहीं, तो क्या यह भाषा में एक दोष है, या क्या संभवतः सभी संभावित स्थानों को निर्धारित करने के लिए पर्याप्त निहित नियम हैं?