ऑपरेटर के साथ वर्ग सी की एक नई वस्तु बनाना () यहाँ एक त्रुटि देता है:
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