2014-12-20 8 views
6

कोड पर विचार करें:विसंगति वस्तुओं

error: default initialization of an object of const type 
     'const Foo' requires a user-provided default constructor 

मुझे यकीन है कि जो है नहीं कर रहा हूँ:

struct Foo 
{ 
    int x = 10; 
}; 

int main() 
{ 
    const Foo foo; 
} 

यह छ ++ http://coliru.stacked-crooked.com/a/99bd8006e10b47ef के तहत संकलित, तथापि बजना ++ के तहत http://coliru.stacked-crooked.com/a/93f94f7d9625b579 एक त्रुटि थूक यहीं। हम कक्षा के प्रारंभिकरण के बाद से हमें डिफ़ॉल्ट सीटीआर की आवश्यकता क्यों है?

+0

यहां एक अच्छा जवाब है। http://stackoverflow.com/questions/7411515/why-does-c-require-a-user-provided-default-constructor-to-default-construct-a – Thellimist

+2

यह वह जगह है [राष्ट्रमंडल खेलों मुद्दा 253] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253)। –

+0

@ फ़ुरकन, ध्यान दें कि मुझे पता है कि नियम क्यों है, मुझे समझ में नहीं आता कि यह मेरे मामले में क्यों लागू होता है, क्योंकि मेरी वस्तु रनटाइम पर पूरी तरह से परिभाषित है। – vsoftco

उत्तर

7

कक्षा प्रकार का एक वस्तु केवल डिफ़ॉल्ट हो सकती है - प्रारंभ में यदि उपयोगकर्ता द्वारा प्रदत्त डिफ़ॉल्ट कन्स्ट्रक्टर है। [Dcl.init] से/7:

एक कार्यक्रम एक स्थिरांक योग्य प्रकार T का एक उद्देश्य के डिफ़ॉल्ट प्रारंभ के लिए कहता है, तो T एक उपयोगकर्ता द्वारा प्रदान की डिफ़ॉल्ट निर्माता के साथ एक कक्षा प्रकार होगा।

आपकी कक्षा Foo में यह नहीं है; ब्रेस-या-बराबर-प्रारंभकर्ता की उपस्थिति उपयोगकर्ता द्वारा प्रदत्त डिफ़ॉल्ट कन्स्ट्रक्टर नहीं बनाती है। बल्कि, अपने वर्ग एक परोक्ष परिभाषित डिफ़ॉल्ट निर्माता, जिसका कार्रवाई प्रारंभ को शामिल किया गया के रूप में ब्रेस या बराबर होती है-प्रारंभकर्ता से अनुरोध किया है। (बजना सही है।)

([dcl.fct.def.default], विशेष रूप से अनुच्छेद 5 में, की "उपयोगकर्ता द्वारा प्रदान की", "स्पष्ट रूप से चूक", ​​"परोक्ष घोषणा की," परिभाषाएँ संबंधित है और "परिभाषित के रूप में नष्ट । "पूरा खंड जानने लायक है)

वैसे, यह सी ++ 11 में डिफ़ॉल्ट-प्रारंभ से बचने के लिए आसान है:।

const Foo foo {}; // hunky-dory 
+0

** + 1 ** "हंकी डोरी" के लिए। :) –

+0

'{}' क्या अंतर है ?? – 0x499602D2

+0

@ 0x499602D2 यह मूल्य-प्रारंभिक है, इसलिए संकलक खुश है कि 'const' में आपके पास सबकुछ प्रारंभ हुआ है। मुझे लगता है कि मेरे मामले में समस्या तब होती है जब आपके पास अतिरिक्त 'y' चर होता है जिसे आप कक्षा में प्रारंभ नहीं करते हैं। मानक सी ++ ने फैसला किया कि यह जांच करने से परेशान नहीं होगा कि सभी सदस्य कक्षा में प्रारंभिक हैं, इसलिए पुराना नियम अभी भी लागू है। – vsoftco

3

clang 8,5 के अनुसार सही प्रतीत हो रहा है [dcl.init ] अनुच्छेद 7 अंतिम वाक्य:

एक कार्यक्रम एक const -qualified प्रकार T का एक उद्देश्य के डिफ़ॉल्ट प्रारंभ के लिए कहता है, तो T एक उपयोगकर्ता द्वारा प्रदान की डिफ़ॉल्ट निर्माता के साथ एक कक्षा प्रकार होगा।

स्पष्ट रूप से, इस प्रकार के उपयोगकर्ता द्वारा प्रदत्त डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है।

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