अंतर जीसीसी इस विफल रहता है, मानक (जो कहता है कि सूची आरंभीकरण के लिए, स्पष्ट कंस्ट्रक्टर्स माना जाता है के अनुसार पर
struct A { explicit A(int); };
struct B { B(int); };
void f(A);
void f(B);
int main() {
f({ 1 });
}
को कम किया जा सकता है - तो वे एक अस्पष्टता उपज सकते हैं - लेकिन वे सिर्फ चुने जाने की अनुमति नहीं है)। क्लैंग इसे स्वीकार करता है और दूसरे समारोह को कॉल करता है।
आपके मामले में, @Columbo Direct list initialization compiles successfully, but normal direct initialization fails, why? पर उनके उत्तर में क्या कहता है लागू होता है। इस मामले में कि आपके मामले में B(const B&);
अब क्लैंग को स्वीकार्य नहीं है क्योंकि {0} -> B
रूपांतरण दो संभावनाओं का सामना करेगा: स्पष्ट कन्स्ट्रक्टर या कॉपी कन्स्ट्रक्टर का दो बार फिर से उपयोग करना। जैसा कि ऊपर बताया गया है, पहला विकल्प क्लैंग द्वारा नहीं माना जाएगा और इस बार @ कोल्मुबो द्वारा स्पष्टीकरण लागू होता है और कॉपी कन्स्ट्रक्टर को दूसरी बार उपयोग नहीं किया जा सकता है क्योंकि उसे उपयोगकर्ता परिभाषित रूपांतरण की आवश्यकता होगी क्योंकि हमारे पास एक तत्व है (यहां, 0
)। तो संक्षेप में, केवल पहला कन्स्ट्रक्टर सफल होता है और लिया जाता है।
के बाद से मैं समझता हूँ कि इस मुद्दे को अजीब अधिभार संकल्प नियमों के बारे में है और कुछ का पालन करने में सक्षम नहीं हो सकता है, यहाँ एक अधिक सहज व्याख्या दी गई है। नियम है कि सक्रिय कर रहे हैं, ताकि
इसलिए जीसीसी के लिए इसे सीधे स्पष्ट निर्माता का उपयोग कर सकते हैं, और प्रतिलिपि निर्माता का एक बार उपयोग द्वारा अलावा। क्लैंग के लिए, यह केवल स्पष्ट कन्स्ट्रक्टर का उपयोग करने पर विचार करता है, और यह जीसीसी की तरह प्रतिलिपि बनाने वाले का उपयोग करके प्रतिलिपि-प्रारंभिकरण द्वारा अप्रत्यक्ष रूप से इसका उपयोग नहीं करेगा। दोनों दूसरी बार कॉपी कन्स्ट्रक्टर का उपयोग करने पर विचार नहीं करेंगे, और यह यहां अप्रासंगिक है।
स्रोत
2015-10-10 16:52:02
http://stackoverflow.com/q/32469979/3647361 का डुप्लिकेट? – Columbo
@ कोल्लमबो बी (ए) 'यहां स्पष्ट है और http://stackoverflow.com/questions/32469979/direct-list-initialization-compiles-sccessfully-but-normal-direct-initializati दोनों जीसीसी और क्लैंग एक ही परिणाम प्राप्त करते हैं लेकिन यहाँ अलग है। – stackcpp
मेरा अनुमान है कि यह विभिन्न डिफ़ॉल्ट मानकों/मानक समर्थन के कारण है। –