इसे समझने के लिए enum, इसके बिना विध्वंसक पर विचार करने के साथ शुरू करें:
~scoped_ptr() {
delete ptr_;
}
जहां ptr_एक है C*। यदि Cइस बिंदु पर टाइप अधूरा है, यानी वह सब जो कंपाइलर जानता है struct C;, तो (1) एक डिफ़ॉल्ट-जेनरेट डू-नथिंग डिस्ट्रक्टर को इंगित किए गए C उदाहरण के लिए उपयोग किया जाता है। स्मार्ट पॉइंटर द्वारा प्रबंधित ऑब्जेक्ट के लिए यह सही होने की संभावना नहीं है।
यदि एक पॉइंटर को अपूर्ण प्रकार से हटाने पर हमेशा अपरिभाषित व्यवहार होता है, तो मानक को केवल कंपाइलर का निदान करने और विफल होने की आवश्यकता हो सकती है। लेकिन यह अच्छी तरह से परिभाषित है जब वास्तविक विनाशकारी तुच्छ है: ज्ञान जो प्रोग्रामर के पास हो सकता है, लेकिन संकलक के पास नहीं है। भाषा क्यों परिभाषित करती है और इसे अनुमति देती है यह मेरे से परे है, लेकिन C ++ कई प्रथाओं का समर्थन करता है जिन्हें आज सर्वोत्तम प्रथाओं के रूप में नहीं माना जाता है।
एक पूर्ण प्रकार का एक ज्ञात आकार होता है, और इसलिए, sizeof(C)यदि और केवल Cएक पूर्ण प्रकार है - ज्ञात विध्वंसक के साथ संकलित करेगा । तो यह एक गार्ड के रूप में इस्तेमाल किया जा सकता है। एक तरीका बस होगा
(void) sizeof(C);
मुझे लगता है कि कुछ संकलक और विकल्पों के साथ संकलक इसे दूर कर देता है इससे पहले कि यह नोटिस कर सकता है कि यह संकलन नहीं करना चाहिए, और यह इस enumतरह के गैर-अनुरूप संकलक व्यवहार से बचने का एक तरीका है:
enum { type_must_be_complete = sizeof(C) };
enumकेवल एक खारिज अभिव्यक्ति के बजाय विकल्प के लिए एक वैकल्पिक स्पष्टीकरण , बस व्यक्तिगत पसंद है।
या जैसा कि जेम्स टी। हगेट इस उत्तर के लिए एक टिप्पणी में सुझाव देते हैं , "संकलन समय पर एक छद्म पोर्टेबल त्रुटि संदेश बनाने का एक तरीका हो सकता है"।
(1) अपूर्ण प्रकार के लिए डिफ़ॉल्ट-जेनरेट डू-नथिंग डिस्ट्रक्टर पुराने के साथ एक समस्या थी std::auto_ptr। यह इतना कपटी था कि इसने PIMPL मुहावरे के बारे में एक GOTW आइटम में अपनी जगह बनाई , जिसे अंतर्राष्ट्रीय C ++ मानकीकरण समिति हर्ब सटर की कुर्सी द्वारा लिखा गया था। बेशक, आजकल जो std::auto_ptrपदावनत है, कोई इसके बजाय किसी अन्य तंत्र का उपयोग करेगा।
ptr_अपने आप मेंsizeofके रूप मेंsizeof(*ptr_)के बजायsizeof(C)।