मैं बेस क्लास के रचनाकारों के उत्तराधिकारी के लिए सी ++ 11 प्रत्यक्ष डेटा सदस्य प्रारंभिकरण और "उपयोग" वाक्यविन्यास के संयोजन का उपयोग करने की कोशिश कर रहा हूं। अब जीसीसी 5.4.0 (उबंटू 16.04 पर) के साथ मैं एक अजीब त्रुटि का निरीक्षण करता हूं, यदि डेटा सदस्य प्रकार में कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। यह शायद समझने के लिए जब निम्न न्यूनतम उदाहरण पर देख सबसे आसान है:कन्स्ट्रक्टर विरासत और प्रत्यक्ष सदस्य प्रारंभिकरण
#include <iostream>
struct Foo {
Foo(int arg) { std::cout << "Foo::Foo(" << arg << ")" << std::endl; }
};
struct Base {
Base(int arg) { std::cout << "Base::Base(" << arg << ")" << std::endl; }
};
struct Derived : public Base {
using Base::Base;
Foo foo{42};
};
int main() {
Derived derived{120};
}
इस कोड को संकलित करता है तथा बजना के साथ अपेक्षित व्यवहार के साथ निष्पादित करता है। जीसीसी के साथ यह संकलन नहीं है, क्योंकि संकलक निर्माता हटाता Derived::Derived(int)
:
ttt.cpp: In function ‘int main()’:
ttt.cpp:17:22: error: use of deleted function ‘Derived::Derived(int)’
Derived derived{120};
^
ttt.cpp:12:15: note: ‘Derived::Derived(int)’ is implicitly deleted because the default definition would be ill-formed:
using Base::Base;
^
ttt.cpp:12:15: error: no matching function for call to ‘Foo::Foo()’
ttt.cpp:4:3: note: candidate: Foo::Foo(int)
Foo(int arg) { std::cout << "Foo::Foo(" << arg << ")" << std::endl; }
^
ttt.cpp:4:3: note: candidate expects 1 argument, 0 provided
ttt.cpp:3:8: note: candidate: constexpr Foo::Foo(const Foo&)
struct Foo {
^
ttt.cpp:3:8: note: candidate expects 1 argument, 0 provided
ttt.cpp:3:8: note: candidate: constexpr Foo::Foo(Foo&&)
ttt.cpp:3:8: note: candidate expects 1 argument, 0 provided
मैं इस तरह Foo के लिए एक डिफ़ॉल्ट निर्माता जोड़ते हैं:
Foo() { std::cout << "Foo::Foo()" << std::endl; };
भी जीसीसी यह संकलन कर सकते हैं। कोड बिल्कुल उसी तरह व्यवहार करता है, विशेष रूप से फू के अतिरिक्त डिफॉल्ट कन्स्ट्रक्टर को निष्पादित नहीं किया जाता है।
तो मेरा सवाल अब है, क्या यह वैध सी ++ 11 है? यदि हां, तो शायद मुझे जीसीसी में एक बग मिला है। अन्यथा, क्या gcc और clang दोनों को एक त्रुटि संदेश नहीं देना चाहिए कि यह वैध C++ 11 मान्य नहीं है?
प्रश्न के बाद संपादित करें @ vlad-from-moscow द्वारा अच्छी तरह से उत्तर दिया गया था: यह बग जीसीसी 6.2 में भी मौजूद है, इसलिए मैं एक बग रिपोर्ट दर्ज करूंगा।
2 संपादित करें: वहां पहले से ही एक बग, जो मैं पहले खोज में नहीं मिला है: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67054
मुझे cppreference.com जैसे पृष्ठों पर इसके बारे में कुछ भी नहीं मिल रहा है। "उपयोग" वाक्यविन्यास और ब्रेस प्रारंभकर्ता दोनों का वर्णन किया गया है, लेकिन दोनों को संयोजन के बारे में कुछ भी उल्लेख नहीं किया गया है। –