2015-11-04 9 views
12

कैसे अंतर समझाने के लिए एकत्रित करती है, जब मैं निम्नलिखित कोड का #if 0 और #if 1 संस्करणों संकलन:स्पष्ट डिफॉल्ट की डिफ़ॉल्ट निर्माता और

#include <cstdlib> 

struct A 
{ 
    explicit A() = default; // explicitly defaulted or deleted constructors are allowed for aggregates (since C++11) 
#if 1 
private : 
#endif 
    int i; 
}; 

int 
main() 
{ 
    A a = {}; 
    return EXIT_SUCCESS; 
} 
  • #if 0 सभी के लिए ठीक है, संकलन सफल।
  • #if 1 संकलन के लिए
  • त्रुटि संदेश के साथ विफल हुआ:

    error: chosen constructor is explicit in copy-initialization

अभिव्यक्ति A a = {}; कि क्या A aggreagate है या नहीं पर निर्भर करता है के लिए क्या अंतर है?

+2

मुझे लगता है कि आपने इसे स्वयं उत्तर दिया है। जब आप त्रुटि प्राप्त करते हैं ए एक समग्र संरचना नहीं है। तो आप प्रारंभिक सूची का उपयोग करके इसे प्रारंभ नहीं कर सकते हैं। – Jonathan

+0

@ जोनाथन मेरी समझ (गूंगा "यह एकजुटता पर निर्भर करता है") बिल्कुल स्पष्ट नहीं है। मैं सटीक स्पष्टीकरण सुनना चाहता हूं। – Orient

उत्तर

8

टीएल; डीआर: क्लैंग और जीसीसी आपके कोड को अस्वीकार करने में गलत हैं। CWG 1630 के रेज़ोल्यूशन ने चयनित डिफ़ॉल्ट कन्स्ट्रक्टर explicit या नहीं होने पर ध्यान दिए बिना डिफ़ॉल्ट-प्रारंभिक रूप से गठित किया।


अपने कोड की भिन्नता है, जिसमें iprivate है, A नहीं एक समग्र, इन निजी सदस्य नहीं हो सकते है। जब तक ipublic है, हालांकि, A एक कुल है, और कुल प्रारंभिक प्रारंभ होने के बाद कोई कन्स्ट्रक्टर नहीं लगाया जाता है (नीला बॉक्स देखें), इसलिए आपका कन्स्ट्रक्टर explicit अप्रासंगिक है।

enter image description here

हालांकि, जैसे ही आप निजी सदस्य परिचय, आप मूल्य-प्रारंभ लाल बॉक्स के अनुसार आवश्यकता होती है। इसलिए [dcl.init]/(8.2) लागू होता है:

[dcl.init]/(7.1) इस मामले के लिए परिभाषित करता है डिफ़ॉल्ट-प्रारंभ:

enter image description here

और §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).

+2

[सीडब्ल्यूजी 1518] नहीं है (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1518) इस मामले से प्रासंगिक है? – bogdan

+0

@bogdan रुको, तो मेरा प्रारंभिक निष्कर्ष सही था? – Columbo

+0

मैं ऐसा कहूंगा, लेकिन मुझे 100% यकीन नहीं है :-)। – bogdan

संबंधित मुद्दे