C++20 एक "नष्ट करने वाले ऑपरेटर को हटाने" की अवधारणा का परिचय देता है, जैसा कि नीचे वर्णित है :

डिलीट-एक्सप्रेशन ऑपरेटर को कॉल करने से पहले *p के लिए डिस्ट्रक्टर को निष्पादित नहीं करता है डिलीट

तो, निम्नलिखित struct S दिया गया है:

struct S {
    void operator delete(S* p, std::destroying_delete_t);

private:
    ~S();
};

मैं नीचे delete से डिस्ट्रक्टर को कॉल न डालने की अपेक्षा करता हूं, लेकिन हमारे द्वारा प्रदान किए गए डिलीट करने वाले ऑपरेटर को कॉल करें

delete new S;

हालांकि, GCC/Clang/MSVC अलग तरह से व्यवहार करता है: DEMO

केवल जीसीसी ~S() तक पहुंचने का प्रयास नहीं करता है, दूसरों को अभी भी ~S() पहुंच योग्य होने की आवश्यकता है।

कौन सा सही है?

7
Jamboree 8 सितंबर 2020, 18:48

1 उत्तर

सबसे बढ़िया उत्तर

जीसीसी सही है: ~S() को पहुंच योग्य नहीं होना चाहिए।

[expr.delete]/6 से:

यदि डिलीट-एक्सप्रेशन के ऑपरेंड का मान एक शून्य सूचक मान नहीं है और चयनित डीललोकेशन फ़ंक्शन (नीचे देखें) एक नष्ट करने वाला ऑपरेटर डिलीट नहीं है, तो डिलीट-एक्सप्रेशन वस्तु या हटाए जा रहे सरणी के तत्वों के लिए विध्वंसक (यदि कोई हो) का आह्वान करेगा।

यह केवल नहीं को नष्ट करने के मामले में है कि विनाशक का आह्वान किया जाता है। दरअसल, यह नष्ट करने का पूरा बिंदु है - कक्षा लेखक को विनाशक को कैसे/कब करना है इसका नियंत्रण देने के लिए। इस प्रकार, कोई आवश्यकता नहीं है कि विनाशक पहुंच योग्य हो - इसे लागू करने के लिए भाषा पर निर्भर नहीं है, यह उपयोगकर्ता पर निर्भर है।

3
Barry 8 सितंबर 2020, 19:16