2011-11-11 18 views
14

यह वर्तमान MSVC संकलक के साथ बिल्कुल ठीक संकलित:अप्रारंभीकृत स्थिरांक

struct Foo 
{ 
} const foo; 

हालांकि, यह वर्तमान जी के साथ संकलित करने के लिए विफल रहता है ++ संकलक:

error: uninitialized const 'foo' [-fpermissive] 
note: 'const struct Foo' has no user-provided default constructor 

अगर मैं एक डिफ़ॉल्ट निर्माता अपने आप को, इसे प्रदान काम करता है:

struct Foo 
{ 
    Foo() {} 
} const foo; 

क्या एमएसवीसी का यह एक और मामला बहुत अनुमोदित है, या जी ++ बहुत सख्त है?

+0

ग्रेट प्रश्न श्री ओवरफ्लो। –

+0

डुप्लिकेट्स: http://stackoverflow.com/questions/5335836/why-a-const-object-of-an-empty-class-cant-be-created http://stackoverflow.com/questions/7411515/why- क्या-सी-आवश्यकता-ए-उपयोगकर्ता-प्रदत्त-डिफ़ॉल्ट-कन्स्ट्रक्टर-टू-डिफॉल्ट-निर्माण-दूसरों के बीच में है। – GManNickG

+0

मैं इसे किसी भी बोली विकल्प के साथ जीसीसी 4.6.1 पर पुन: उत्पन्न नहीं कर सकता। यह केवल तभी काम करता है जब मैं एक सदस्य चर स्थापित करता हूं (जैसे 'int a; '), और त्रुटि अधिक सटीक है:' कॉन्स्ट स्ट्रक्चर फू 'में कोई उपयोगकर्ता द्वारा प्रदत्त डिफॉल्ट कन्स्ट्रक्टर नहीं है और अंतर्निहित परिभाषित कन्स्ट्रक्टर' int 'प्रारंभ नहीं करता है Foo :: a'' –

उत्तर

13

सी ++ 03 मानक:

8,5 [dcl.init] अनुच्छेद 9

कोई प्रारंभकर्ता एक वस्तु के लिए निर्दिष्ट किया जाता है, और वस्तु (संभवतः सीवी की है - योग्य) गैर-पीओडी वर्ग प्रकार (या इसकी सरणी), वस्तु डिफ़ॉल्ट-प्रारंभिक होगी; यदि ऑब्जेक्ट कॉन्स-क्वालिफाइड प्रकार का है, तो अंतर्निहित क्लास प्रकार में उपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर होगा।

उपरोक्त से जीसीसी में त्रुटि पूरी तरह से मान्य प्रतीत होती है।

+7

+1 :-) –

1

मुझे मानक की सटीक शब्दावली नहीं पता है, लेकिन जी ++ में त्रुटि कुछ भी नहीं कहने के विकल्प से ज्यादा समझदार लगती है। इस पर विचार करें:

struct X { 
    int value; 
}; 
const X constant; // constant.value is undefined 

नहीं एक उपयोगकर्ता प्रदान की डिफ़ॉल्ट निर्माता (भले ही वह कुछ नहीं करता है) संकलक कि निर्माता कॉल करेंगे और वस्तु प्रारंभ (द्वारा जो कुछ भी की परिभाषा प्रारंभ आप हो जाएगा के मामले में आपके कन्स्ट्रक्टर में लागू किया है)।

3

[2003: 8.5/9]:कोई प्रारंभकर्ता एक वस्तु के लिए निर्दिष्ट किया जाता है, और वस्तु (संभवतः सीवी-योग्य) गैर-पॉड वर्ग प्रकार (या सरणी क्या है) का है, तो वस्तु डिफ़ॉल्ट-प्रारंभ होगी ; यदि ऑब्जेक्ट कॉन्स्ट-क्वालिफाइड प्रकार का है, तो अंतर्निहित क्लास प्रकार में उपयोगकर्ता द्वारा घोषित डिफ़ॉल्ट कन्स्ट्रक्टर होगा। अन्यथा, यदि कोई प्रारंभकर्ता गैर-ऑब्जेक्टिक ऑब्जेक्ट के लिए निर्दिष्ट है, तो ऑब्जेक्ट और इसके उप-प्रोजेक्ट, किसी भी, अनिश्चित प्रारंभिक मान है; यदि ऑब्जेक्ट या में से कोई भी उप-प्रोजेक्ट कॉन्स्ट-क्वालिफाइड प्रकार के हैं, तो प्रोग्राम खराब हो गया है।

और:

[n3290: 8.5/11]:कोई प्रारंभकर्ता एक वस्तु के लिए निर्दिष्ट है, तो वस्तु डिफ़ॉल्ट-प्रारंभ होता है, यदि कोई प्रारंभिकता निष्पादित नहीं है, तो स्वचालित या गतिशील संग्रहण अवधि वाले ऑब्जेक्ट में अनिश्चित मूल्य है। [नोट: स्थिर या थ्रेड स्टोरेज के साथ ऑब्जेक्ट अवधि शून्य-प्रारंभिक हैं, 3.6.2 देखें।_ अंत note_]

[n3290: 8.5/6]:करने के लिए डिफ़ॉल्ट आरंभ कर प्रकार T की एक वस्तु का अर्थ है:

  • अगर T (संभवत: सीवी-योग्य) वर्ग प्रकार (धारा 9), डिफ़ॉल्ट निर्माता है टी के लिए कहा जाता है (और प्रारंभिकता खराब हो जाती है अगर T में कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है);
  • यदि T एक सरणी प्रकार है, तो प्रत्येक तत्व डिफ़ॉल्ट-प्रारंभ होता है;
  • अन्यथा, कोई प्रारंभिकता नहीं की जाती है।

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

तो एमएसवीसी दोनों मानक मानदंडों की तुलना में यहां अधिक अनुमोदित है।

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