2009-01-19 9 views
53

C++ में निम्नलिखित कोड एक संकलक त्रुटि देता है होता है:Destructors (int, चार आदि ..)

typedef int myint; 

void destruct2 (myint * item) 
{ 
    item->~myint(); 
} 

दूसरा कोड क्यों काम करता है? क्या इंटेल को केवल विनाशक हो जाता है क्योंकि इसे टाइप किया गया है?

यदि आपको आश्चर्य है कि कोई ऐसा क्यों करना चाहेगा: यह सी ++ कोड को दोबारा करने से आता है। हम मानक ढेर को हटा रहे हैं और इसे स्वयं के पूल के साथ बदल रहे हैं। इसके लिए हमें नियुक्ति-नए और विनाशकों को कॉल करने की आवश्यकता है। मुझे पता है कि प्राचीन प्रकार के लिए विनाशकों को बुलावा बेकार है, लेकिन हम उन्हें कोड में तब भी चाहते हैं जब हम बाद में वास्तविक वर्गों के साथ पीओडी को प्रतिस्थापित करते हैं।

यह पता लगाना कि नग्न int काम नहीं करता है लेकिन टाइप किए गए लोग आश्चर्यचकित थे।

बीटीडब्ल्यू - मेरे पास एक समाधान है जिसमें टेम्पलेट-फ़ंक्शन शामिल हैं। हम सिर्फ टेम्पलेट के अंदर typedef और सब कुछ ठीक है।

उत्तर

77

यही कारण है कि आपके कोड सामान्य पैरामीटर के लिए काम करता है। एक कंटेनर पर विचार करें सी:

template<typename T> 
struct C { 
    // ... 
    ~C() { 
     for(size_t i = 0; i<elements; i++) 
      buffer[i].~T(); 
    } 
}; 

अंतर्निहित प्रकारों के लिए विशेष मामलों को पेश करना परेशान होगा। इसलिए सी ++ आपको उपर्युक्त करने की अनुमति देता है, भले ही टी int के बराबर हो। पवित्र स्टैंडर्ड 12.4 p15 में कहते हैं:

The notation for explicit call of a destructor can be used for any scalar type name. Allowing this makes it possible to write code without having to know if a destructor exists for a given type.

एक सादे पूर्णांक और एक typedef'ed पूर्णांक का उपयोग कर के बीच अंतर यह है कि वे वाक्य रचना अलग अलग बातें कर रहे हैं। नियम यह है कि एक विनाशक कॉल में, ~ के बाद की बात एक प्रकार का नाम है। int ऐसी कोई बात नहीं है, लेकिन एक टाइपिफ़-नाम है। इसे 7.1.5.2 में देखें।

+13

+1 "पवित्र मानक" के लिए +1। – ApprenticeHacker

+0

मुझे लगता है कि यह पुराना कंपाइलर्स (2012-2014) – GameDeveloper

+0

के भीतर असंगत std :: is_destructible बनाता है जो इस उत्तर को पर्याप्त वोट नहीं दे सकता! – Nils

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