टीएल; डीआर: क्लैंग और जीसीसी आपके कोड को अस्वीकार करने में गलत हैं। CWG 1630 के रेज़ोल्यूशन ने चयनित डिफ़ॉल्ट कन्स्ट्रक्टर explicit
या नहीं होने पर ध्यान दिए बिना डिफ़ॉल्ट-प्रारंभिक रूप से गठित किया।
अपने कोड की भिन्नता है, जिसमें i
private
है, A
नहीं एक समग्र, इन निजी सदस्य नहीं हो सकते है। जब तक i
public
है, हालांकि, A
एक कुल है, और कुल प्रारंभिक प्रारंभ होने के बाद कोई कन्स्ट्रक्टर नहीं लगाया जाता है (नीला बॉक्स देखें), इसलिए आपका कन्स्ट्रक्टर explicit
अप्रासंगिक है।
हालांकि, जैसे ही आप निजी सदस्य परिचय, आप मूल्य-प्रारंभ लाल बॉक्स के अनुसार आवश्यकता होती है। इसलिए [dcl.init]/(8.2) लागू होता है:
[dcl.init]/(7.1) इस मामले के लिए परिभाषित करता है डिफ़ॉल्ट-प्रारंभ:
और §13.3 .1.3
For […] default-initialization, the candidate functions are all the constructors of the class of the object being initialized.
किसी भी समय मूल संदर्भ - प्रति- या प्रत्यक्ष-प्रारंभिकता - माना जाता है। (§13.3.1.7 या तो लागू नहीं होता है।) वास्तव में, इसका इरादा है; देख CWG #1518:
This issue is resolved by the resolution of issue 1630 : default initialization now uses 13.3.1.3 [over.match.ctor], which now permits explicit constructors for default-initialization.
बजना और जीसीसी (और कुलपति ++) अभी तक इसी डॉ लागू नहीं किया है और इस तरह सी ++ 14 मोड में कोड को खारिज करने में सही नहीं हैं।
1) आपकी कक्षा एक उपयोगकर्ता के घोषित निर्माता है, लेकिन यह उपयोगकर्ता- नहीं है प्रदान की, यानि कि एक समग्र होने से अपनी कक्षा अड़चन नहीं। परिभाषा को याद करें [dcl.init.aggr]/1:
An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).
मुझे लगता है कि आपने इसे स्वयं उत्तर दिया है। जब आप त्रुटि प्राप्त करते हैं ए एक समग्र संरचना नहीं है। तो आप प्रारंभिक सूची का उपयोग करके इसे प्रारंभ नहीं कर सकते हैं। – Jonathan
@ जोनाथन मेरी समझ (गूंगा "यह एकजुटता पर निर्भर करता है") बिल्कुल स्पष्ट नहीं है। मैं सटीक स्पष्टीकरण सुनना चाहता हूं। – Orient