g++
त्रुटि में एक अच्छा विवरण देता है:
bla.cpp:6:5: note: ‘D::D()’ is implicitly deleted because the default definition would be ill-formed: D() = default;
डिफ़ॉल्ट निर्माता D
के सभी भागों का निर्माण करने का प्रयास करेंगे। आपके पास कोई फ़ील्ड नहीं है, लेकिन इसमें प्रारंभिक B
है - जिसमें कोई खाली कन्स्ट्रक्टर नहीं है, केवल int
एक है।
डिफ़ॉल्ट व्यवहार समझ में आता है - D
जब तक कि यह स्पष्ट रूप से कहा जो int
साथ B
के निर्माण के लिए एक खाली निर्माता नहीं करना चाहिए था, और संकलक अनुमान लगाना नहीं चाहता है। अन्यथा आपके पास D
ऑब्जेक्ट होगा, और B
कन्स्ट्रक्टर B
में जो होता है उसके आधार पर जंक हो सकता है, उदाहरण के लिए यदि कोई फ़ील्ड प्रारंभ करना है।
मुझे यकीन है कि अगर आप अपने सवाल का शाब्दिक मतलब जब आप से पूछना क्यों यह "अनुमति" है, के रूप में B
डिफ़ॉल्ट निर्माता हटा दी जाती है नहीं कर रहा हूँ, लेकिन मैं दो कारणों के बारे में सोच सकते हैं:
- यह व्यवहार अच्छी तरह से परिभाषित किया गया है, और इसे अस्वीकार करने का कोई कारण नहीं है। त्रुटि का पता लगाना केवल तभी जब आप अवैध रूप से कुछ बनाने का प्रयास करते हैं, वैसे भी किया जाता है।
- यह अधिक लचीला है -
B
बदलने के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर स्वचालित रूप से D
को एक होने की अनुमति देगा।
यदि आप बी बदलते हैं, डी स्वचालित रूप से सही-सही काम करेगा। –
आप किस कंपाइलर का उपयोग कर रहे हैं?ऐसा इसलिए हो सकता है क्योंकि आपकी संरचना खाली है और कुछ भी नहीं करता है, इसलिए संकलक इसे पूरी तरह से '= default' के साथ परिभाषित करता है? –
जी ++ 5.1.0 'नोट: 'डी :: डी()' को पूरी तरह से हटा दिया गया है क्योंकि डिफ़ॉल्ट परिभाषा खराब हो जाएगी:' और 'त्रुटि: 'बी :: बी()'' –