2015-09-11 7 views
9

मुझे समझ में नहीं आ रहा है कि आप एक वर्ग को संकलित क्यों नहीं कर सकते हैं जिसमें एक सदस्य (डिफ़ॉल्ट रूप से रचनात्मक नहीं) दोनों के साथ एक ब्रेस-या-बराबर प्रारंभकर्ता और विरासत कन्स्ट्रक्टर है। जी ++ का कहना है:कन्स्ट्रक्टर और ब्रेस-या-बराबर प्रारंभकर्ताओं को विरासत

test.cpp:22:15: error: use of deleted function ‘Derived::Derived(float)’
Derived d(1.2f);

test.cpp:16:13: note: ‘Derived::Derived(float)’ is implicitly deleted
because the default definition would be ill-formed:
using Base::Base;

test.cpp:16:13: error: no matching function for call to ‘NoDefCTor::NoDefCTor()’
test.cpp:5:1: note: candidate:
NoDefCTor::NoDefCTor(int) NoDefCTor(int) {}

कोड है कि (छ ++ के तहत 5.1) को संकलित करने में विफल रहता है:

struct NoDefCTor 
{ 
    NoDefCTor(int) {} 
}; 

struct Base 
{ 
    Base(float) {} 
}; 

struct Derived : Base 
{ 
    using Base::Base; 
    NoDefCTor n2{ 4 }; 
}; 

int main() 
{ 
    Derived d(1.2f); 
} 

कोड है कि संकलित, लेकिन कभी नहींNoDefCTor के डिफ़ॉल्ट निर्माता का उपयोग करता है (जाहिरा तौर पर यह जरूरत के बावजूद!):

struct NoDefCTor 
{ 
    NoDefCTor(int) {} 
    NoDefCTor() = default; 
}; 

struct Base 
{ 
    Base(float) {} 
}; 

struct Derived : Base 
{ 
    using Base::Base; 
    NoDefCTor n2{ 4 }; 
}; 

int main() 
{ 
    Derived d(1.2f); 
} 

मुझे वास्तव में एक डिफ़ॉल्ट कन्स्ट्रक्टर होने का विचार पसंद नहीं है जब मुझे किसी की आवश्यकता नहीं है। एक तरफ ध्यान दें कि दोनों संस्करण MSVC14 पर बस ठीक (और व्यवहार) संकलित करते हैं।

+2

यह जीसीसी बग? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62310 – dyp

+3

या यह gcc बग? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67054 – dyp

+0

@dyp धन्यवाद। यह वास्तव में दूसरी बग है। मैंने सोचा कि यह एक भाषा की बात थी। – maxbc

उत्तर

6

यह gcc bug, #67054 है। ओपी के मामले में alltaken380 द्वारा बग रिपोर्ट तुलना:

// gcc bug report      // OP 
struct NonDefault      struct NoDefCTor 
{          { 
    NonDefault(int) {}      NoDefCTor(int) {} 
};          }; 

struct Base        struct Base 
{          { 
    Base(int) {}        Base(float) {} 
};          }; 

struct Derived : public Base    struct Derived : Base 
{          { 
    NonDefault foo = 4;      NoDefCTor n2{ 4 }; 

    using Base::Base;      using Base::Base; 
};          }; 

auto test()        int main() 
{          { 
    auto d = Derived{ 5 };     Derived d(1.2f); 
}          } 

हम भी हाल ही में जीसीसी 6.0 संस्करण पर इस कोशिश कर सकते हैं, और यह अभी भी संकलित करने के लिए विफल रहता है। क्लाउड ++ 3.6 और, ओपी के अनुसार, एमएसवीसी 14 इस कार्यक्रम को स्वीकार करते हैं।

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