ऑपरेटर के साथ वर्ग सी की एक नई वस्तु बनाना () यहाँ एक त्रुटि देता है:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
साथ में C2280: 'void C::operator delete(void *)': function was explicitly deleted
लेकिन जब मैं बदलने के C() {}
साथ C() = default;
या तो यह है कि संकलक एक डिफ़ॉल्ट निर्माता (जो मेरा मानना है कि के साथ एक ही प्रभाव पड़ता है सम्मिलित करता है लाइन को हटाने = default), कोड संकलन और रन होगा।
कंपाइलर-जनरेटेड डिफॉल्ट कंस्ट्रक्टर और यूज़र-डिफ़ाइंड डिफॉल्ट कंस्ट्रक्टर के बीच क्या अंतर हैं जो ऐसा करते हैं?
मुझे इस पोस्टिंग में कुछ संकेत मिले , लेकिन क्लास सी यहाँ (उपयोगकर्ता द्वारा प्रदान किए गए निर्माता के बिना) तुच्छ नहीं है क्योंकि विध्वंसक आभासी है, है ना?
नवीनतम विज़ुअल स्टूडियो के साथ संकलित, सी ++ 17।
operator delete()कि क्या कंस्ट्रक्टर मैन्युअल रूप से लिखा गया है या अंतर्निहित रूप से उत्पन्न हुआ है। जो मेरी उम्मीदों के अनुरूप है - चूंकि एक अपवाद को newअभिव्यक्ति द्वारा फेंक दिया जा सकता है , इसलिए कंपाइलर को एक्सेस करने की आवश्यकता है operator delete()।
noexceptसे कोड संकलित हो जाएगा, लेकिन कैसे ...?
noexceptसेबस्टियनरेडल के रूप में उल्लिखित है, तो कॉल करने की operator deleteआवश्यकता नहीं है। इसके अलावा जी ++ केवल शिकायत करता है अगर विध्वंसक आभासी है। अन्यथा यह हमेशा संकलित करता है, भले ही कंस्ट्रक्टर फेंक रहा हो।
noexcept