2013-02-22 23 views
5

कोड:में निजी और डिफ़ॉल्ट निर्माता सी ++ 11 और जीसीसी

struct A 
{ 
    private: 
    A() = default; // Version 1. 
}; 
struct B : public A 
{}; 

struct C 
{ 
    private: 
    C() {}; // Version 2. 
}; 
struct D : public C 
{}; 

int main() 
{ 
    B b; // Compiles   under g++ 4.7.2 
    D d; // Compilation error under g++ 4.7.2 
} 

और दो स्थितियों (जीसीसी 4.7.2 के साथ):

  • मैं इस कोड को संकलित हैं (संस्करण 1 के साथ ए के कन्स्ट्रक्टर के), समस्याएं नहीं हैं।
  • यदि मैं दूसरे कन्स्ट्रक्टर का उपयोग करता हूं, तो gcc मुझे बताता है कि D::D() निजी है।

प्रश्न: यदि मैं डिफ़ॉल्ट रचनाकारों का उपयोग करता हूं, तो समस्याएं गायब क्यों होती हैं? यदि A में निजी कन्स्ट्रक्टर हैं, तो अन्य क्लास अपने कन्स्ट्रक्टर के कार्यान्वयन की "डिफ़ॉल्टता" के बावजूद A, यहां तक ​​कि इसके व्युत्पन्न वर्गों के उदाहरण भी नहीं बना सकते हैं।

उत्तर

5

यह एक जीसीसी बग की तरह गंध करता है।

न तो पूरे खण्ड 11 सदस्य अभिगम नियंत्रण है और न ही डिफॉल्ट कंस्ट्रक्टर के बारे में धारा 8.4.2 के बारे में डिफॉल्ट निर्माताओं की पहुंच के स्तर अधिभावी बारे में कुछ भी उल्लेख करते हैं।

इसके अलावा, यह कोड क्लैंग 3.2 और इंटेल आईसीसी 13.0 पर संकलित करता है।

दूसरी ओर, आप टिप्पणी करता है, तो लाइन एक्स, निम्न पंक्ति नहीं आप क्या सोचते हैं क्या करेंगे:

B b(); // This will declare a function that accepts no argument 
     // and returns a value of type B 

आप कोष्ठकों निकालते हैं, तो आप देखना चाहिए समस्या को पॉपिंग:

B b; // ERROR: Constructor of A is private 

हालांकि, जीसीसी 4.7.2 (गलत तरीके से) कोई संकलन त्रुटि नहीं उठाता है। ऐसा लगता है कि यह जीसीसी 4.8.0 (बीटा 20130127 के अनुसार) के बीटा संस्करण में तय नहीं किया गया है।

+0

'लाइन एक्स' के साथ न तो टिप्पणी की? –

+0

@ पेरेगिंग-एलके: मैंने अपना उत्तर –

+0

अपडेट किया है http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56429 –

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