Angew's और jaggedSpire के उत्तर उत्कृष्ट हैं और लागू होते हैंc ++ 11। तथाc ++ 14। तथाc ++ 17।
हालाँकि, में c ++ 20, चीजें थोड़ी बदल जाती हैं और ओपी में उदाहरण अब संकलित नहीं होगा:
class C {
C() = default;
};
C p;
auto q = C();
C r{};
auto s = C{};
जैसा कि दो उत्तरों से बताया गया है, इसका कारण यह है कि बाद के दो घोषणापत्र काम करते हैं क्योंकि C
यह एक एकत्रीकरण है और यह समग्र-आरंभीकरण है। हालांकि, की वजह से P1008 , के लिए C में कुल परिवर्तन की ++ 20 परिभाषा (ओपी से बहुत भिन्न नहीं एक प्रेरित उदाहरण का उपयोग), से [dcl.init.aggr] / 1 :
एक समुच्चय एक सरणी या एक वर्ग ([वर्ग]) है
- कोई उपयोगकर्ता-घोषित या विरासत में दिए गए निर्माणकर्ता ([class.ctor]),
- कोई निजी या संरक्षित प्रत्यक्ष गैर-स्थैतिक डेटा सदस्य ([class.access]),
- कोई वर्चुअल फ़ंक्शंस ([class.virtual]), और
- कोई वर्चुअल, निजी या संरक्षित आधार वर्ग ([class.mi]) नहीं।
जोर मेरा। अब आवश्यकता नहीं है उपयोगकर्ता के घोषित कंस्ट्रक्टर्स, जबकि यह होना करने के लिए (के रूप में दोनों उपयोगकर्ताओं को अपने जवाब में अदालत में तलब और के लिए ऐतिहासिक दृष्टि से देखी जा सकती है इस्तेमाल किया सी ++ 11 , सी ++ 14 , और सी ++ 17 ) कोई उपयोगकर्ता द्वारा प्रदान की कंस्ट्रक्टर्स । के लिए डिफ़ॉल्ट निर्माता C
उपयोगकर्ता-घोषित है, लेकिन उपयोगकर्ता-प्रदत्त नहीं है, और इसलिए C ++ 20 में कुल होना बंद हो जाता है।
यहाँ कुल परिवर्तनों का एक और उदाहरण दिया गया है:
class A { protected: A() { }; };
struct B : A { B() = default; };
auto x = B{};
B
C ++ 11 या C ++ 14 में एक समुच्चय नहीं था क्योंकि इसका आधार वर्ग है। नतीजतन, B{}
बस डिफ़ॉल्ट कंस्ट्रक्टर (उपयोगकर्ता द्वारा घोषित नहीं बल्कि उपयोगकर्ता-प्रदान) को आमंत्रित करता है, जिसकी पहुंच A
डिफॉल्ट डिफॉल्ट कंस्ट्रक्टर तक होती है।
C ++ 17 में, P0017 के परिणामस्वरूप , आधार वर्गों के लिए अनुमति देने के लिए समुच्चय बढ़ाए गए थे। B
C ++ 17 में एक एग्रीगेट है, जिसका अर्थ है कि B{}
एग्रीगेट-इनिशियलाइज़ेशन जिसे सब-सबजेक्ट्स को इनिशियलाइज़ करना है - जिसमें A
सबोबिज भी शामिल है। लेकिन क्योंकि A
डिफॉल्ट कंस्ट्रक्टर संरक्षित है, हमारे पास इसकी पहुंच नहीं है, इसलिए यह इनिशियलाइज़ेशन बीमार है।
C ++ 20 में, B
उपयोगकर्ता के घोषित कंस्ट्रक्टर के कारण, यह फिर से एग्रीगेट होना बंद हो जाता है, इसलिए B{}
डिफॉल्ट कंस्ट्रक्टर को इनवॉइस करने के लिए वापस लौटता है और यह फिर से अच्छी तरह से बनाई गई इनिशियलाइज़ेशन है।
C c{};
प्रारंभिक आरंभीकरण नहीं है, इसलिए किसी भी निर्माता को नहीं कहा जाता है?