मेरे पास static_cast
के बारे में मिश्रित भावनाएं हैं, क्योंकि यह सबसे सुरक्षित सी ++ कास्ट उपलब्ध है, लेकिन एक ही समय में सुरक्षित और असुरक्षित रूपांतरण दोनों की अनुमति देता है, इसलिए आपको यह कहना है कि यह वास्तव में सुरक्षित है या यूबी (उदाहरण के लिए जब एक उप-वर्ग में कास्टिंग)।क्या static_cast दुरुपयोग किया गया है?
तो एक सुरक्षित स्पष्ट कलाकार क्यों नहीं है? यहां एक उदाहरण दिया गया है, जहां यह उपयोगी हो सकता है। कॉम में, वे void** ppv
के रूप में इंटरफ़ेस सूचक वापस जाने के लिए है, तो एक सुरक्षित सी ++
*ppv = static_cast<IInterface*>(this);
डाली लेकिन यह पड़ता है द्वारा डाली पर स्पष्ट रूप
*ppv = (IInterface*) this;
जो तब सुझाव दिया गया था बदला जाएगा "करने के लिए है" यहां तक कि static_cast
भी बनाने की भावना है? this
, एक वर्ग जो IInterface
से निकला की है, इसलिए एक बस
IInterface* p = this; // implicit conversion to base, safe for sure
*ppv = p;
लिख सकते हैं या
template<class T, class U>
T implicit_cast(U p) { return p; }
*ppv = implicit_cast<IInterface*>(this);
तो जैसे एक सहायक इस्तेमाल कर सकते हैं, यह सच है कि static_cast
कभी कभी दुरुपयोग किया जाता है और यह कर सकते हैं है (होना चाहिए?) कुछ मामलों में इस implicit_cast
द्वारा प्रतिस्थापित किया जा सकता है, या क्या मुझे कुछ याद आ रही है?
संपादित करें: मुझे पता है कि a cast is required in COM, लेकिन यह static_cast
होना आवश्यक नहीं है, एक निहित कास्ट पर्याप्त होगा।
नोट: 'implicit_cast' (और एक अच्छा स्पष्टीकरण) के" सही "कार्यान्वयन के लिए http://stackoverflow.com/a/869597 देखें। –