2017-01-05 9 views
9

इंटेल सी ++ संकलक (संस्करण 16.0.3.207 बिल्ड 20,160,415) विरासत जब आधार वर्ग के निर्माता उपयोग करने के साथ विरासत में मिला है स्पष्ट विनिर्देशक छोड़ रहा है। क्या यह एक बग है?एक स्पष्ट निर्माता (इंटेल सी ++)

struct B 
{ 
    explicit B(int) { } 
}; 

struct D : B 
{ 
    using B::B; 
}; 

B b = 1; // Not OK, fine 
D d = 1; // Not OK with Microsoft C++ and GCC, but OK with Intel C++ 
+0

यह निश्चित रूप से एक बग माना जाता है। विरासत रचनाकारों को सिर्फ "उपयोग" निर्देश के साथ उजागर किया जाता है, इसलिए यह बेस क्लास के समान कॉल होना चाहिए। – Argenet

+0

एकमात्र चीज जो मैंने पाया, एक स्पष्ट कन्स्ट्रक्टर की परिभाषा के अलावा: "यदि एक उपयोग-घोषणा एक निर्माता (3.4.3.1) नाम देती है, तो यह स्पष्ट रूप से कक्षा में रचनाकारों का एक सेट घोषित करता है जिसमें उपयोग-घोषणा प्रकट होती है (12.9) "यही वह है। मुझे कुछ भी स्पष्ट नहीं दिखता है (पन इरादा नहीं है) जो बताता है कि एक या दूसरा व्यवहार सही है। –

उत्तर

6

मुझे विश्वास है कि मानक से उचित शब्दों निम्नलिखित (n4296, 12.9 विरासत कंस्ट्रक्टर्स) है:

...

निर्माता विशेषताओं एक निर्माता के या कन्स्ट्रक्टर टेम्पलेट

(2.1) - टेम्पलेट पैरामीटर सूची (14.1), यदि किसी भी,

(2,2) - पैरामीटर प्रकार की सूची (8.3.5), और

(2,3) - अभाव या स्पष्ट (12.3.1) की उपस्थिति।

विरासत में मिला एक निर्माता कोई पैरामीटर या एक कॉपी/कदम निर्माता एक एकल पैरामीटर होने के अलावा अन्य निर्माताओं की उम्मीदवार सेट में प्रत्येक गैर टेम्पलेट निर्माता के लिए, एक निर्माता परोक्ष एक ही निर्माता विशेषताओं के साथ घोषित है जब तक में एक ही हस्ताक्षर के साथ उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर नहीं है, तो पूर्ण श्रेणी जहां उपयोग-घोषणा प्रकट होती है या कन्स्ट्रक्टर उस कक्षा के लिए डिफॉल्ट, कॉपी या कन्स्ट्रक्टर होगा।

...

तो संभवत: यह इंटेल सी ++ संकलक में एक बग है।

+0

एन 4296 एक सी ++ 17 ड्राफ्ट है। N4140 लगभग वर्तमान मानक है। एन 4140 में इस खंड में एक (2.4) बिंदु है –

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