6

हटा दी जाती है, जबकि निम्नलिखित सरल कोड टुकड़ा में:बजना शिकायत "किसी हटाए समारोह ओवरराइड नहीं कर सकते" कोई समारोह

#include <cstddef> 

struct B 
{ 
    virtual ~B() = default; 
    static void operator delete(void *, int); 
    static void * operator new(size_t, int); 
}; 

struct C : B 
{ 
    virtual ~C() = default; 
}; 

बजना 3.7 शिकायत है कि "गैर नष्ट कर दिया समारोह '~ सी' किसी हटाए समारोह ओवरराइड नहीं कर सकते" : http://goo.gl/Ax6oth

न तो विजुअल स्टूडियो और न ही जीसीसी इस कोड में एक त्रुटि रिपोर्ट करता है। क्या यह एक झुकाव दोष है या क्या?

+0

, यह – sp2danny

+1

संकलित मुझे लगता है कि बजना [\ [class.dtor \]/5] (http://eel.is/c+ में तीसरी बुलेट बिंदु के आधार पर यह खारिज की जाती है + ड्राफ्ट/class.dtor # 5)। मुझे पूरा यकीन नहीं है कि यह सही पढ़ना है या नहीं। –

+0

इसे संकलित नहीं करने का अधिकार है, लेकिन त्रुटि संदेश उपयोगी से कम – sp2danny

उत्तर

8
static void operator delete(void *, int); 

नहीं, यह

static void operator delete(void *, std::size_t); 

है और उस प्रकार का अंतर एक अस्पष्टता है कि प्रासंगिक हो जाता है का कारण बनता है:

cppreference.com has

परोक्ष-घोषित या डिफॉल्ट नाशक के लिये वर्ग टी है अपरिभाषित (जब तक सी ++ 11) नष्ट कर दिया के रूप में परिभाषित करता है, तो निम्न में से कोई भी सही है (सी ++ 11 के बाद से):

[...]

परोक्ष-घोषित नाशक है वर्चुअल (क्योंकि बेस क्लास में वर्चुअल डिस्ट्रक्टर है) और डेलोकेशन फ़ंक्शन (ऑपरेटर डिलीट() परिणाम अस्पष्ट, हटाए गए, या पहुंचने योग्य फ़ंक्शन पर कॉल में परिणाम के लिए लुकअप है।

और मानक (मसौदा n4140) कि §12.4 में

5 एक एक दसवीं कक्षा के लिए नाशक चूक के रूप में नष्ट परिभाषित किया गया है है अगर:

[...]

(5.3) या, वर्चुअल विनाशक के लिए, गैर-सरणी डेलोकेशन फ़ंक्शन के परिणाम एक अस्पष्टता में या को हटाए गए फ़ंक्शन में डिफॉल्ट डिस्ट्रक्टर से हटाए गए या पहुंच योग्य नहीं हैं।

सही हस्ताक्षरों के साथ
संबंधित मुद्दे