2015-08-21 12 views
6

के लिए ब्रेसिड प्रारंभिकरण का उपयोग नहीं कर सकता है।क्लैंग उपयोगकर्ता द्वारा परिभाषित रूपांतरण

struct A { 
    A() {} 
}; 

struct B { 
    B() {} 
    explicit operator A() { return A{}; } 
}; 

struct C { 
    A a; 
    C(B b) : a{b} {} 
}; 

मैं एक struct A जो कुल constructible (क्योंकि यह एक निर्माता परिभाषित है) नहीं है। यह struct B के लिए जाता है। लेकिन इसमें struct A पर एक स्पष्ट उपयोगकर्ता परिभाषित रूपांतरण ऑपरेटर भी है। अब struct C का कन्स्ट्रक्टर struct B लेता है, और struct A बनाने के लिए इसका उपयोग करता है। cppreference पर, रूपांतरण ऑपरेटर प्रत्यक्ष प्रारंभ में भाग ले सकता है, जो मुझे लगता है कि सदस्य struct C के सदस्य प्रारंभ करने का मामला है। यह जीसीसी 5.2 (सी ++ 11) पर गुजरता है। लेकिन हालांकि यह क्लेंग 3.6 पर विफल रहता है। मैंने सी ++ 11, सी ++ 14, और सी ++ 1z के साथ प्रयास किया।

यदि मैं a{b} से a(b) बदलता हूं, तो यह क्लैंग और जीसीसी दोनों पर जाता है।

मुझे आश्चर्य है कि यह एक क्लैंग बग है या मैंने मानक को गलत समझा है?

+4

संबंधित [क्या ब्रांडेड प्रारंभकर्ता सूचियों में स्पष्ट रूपांतरण ऑपरेटर की अनुमति है?] (Http://stackoverflow.com/q/27573928/3953764) –

+2

[क्लैंग ++ 3.8.0 में काम करता है] (http://melpon.org/wandbox/permlink/3sDuu76ZIsQPy2ay) –

+0

@PiotrSkotnicki क्या यह शायद http://wg21.cmeerw.net/cwg/issue1467 है? – dyp

उत्तर

1

बजना कारण DR1467 (। सीएफआर 22259) जीसीसी के

हाल संस्करण में हाल ही में बदलाव किए गए हैं और बजना दोनों सही काम किया है: त्रुटियों के बिना अपने कोड संकलन।

सदस्य प्रारंभकर्ता सूची के लिए ओवरलोड रिज़ॉल्यूशन के पहले दौर में ए के रचनाकारों को त्याग दिया जाता है क्योंकि वे प्रारंभकर्ता-सूची निर्माता नहीं हैं।

बाद में [over.match.list]/p1 लेता

से अधिक
  • यदि कोई व्यवहार्य प्रारंभकर्ता-सूची निर्माता पाया जाता है, अधिभार संकल्प फिर से है, जहां उम्मीदवार कार्य हैं किया जाता है सब कक्षा टी और तर्क सूची के रचनाकार प्रारंभकर्ता सूची के तत्वों के होते हैं।

और इस बार ए के रचनाकारों को ध्यान में रखा जाता है। ए की प्रतिलिपि और चालक रचनाकारों के पास ओवरलोड रिज़ॉल्यूशन प्रक्रिया से मेल खाने के लिए पर्याप्त तर्क हैं और वे किसी भी उपयोगकर्ता द्वारा परिभाषित रूपांतरण दमन का कारण 13.3.1.3 और 13.3.1.7 (अभी भी Clang's code में) नहीं करते हैं, इन रचनाकारों पर लागू नहीं होते हैं।

इसलिए वे ओवरलोड रिज़ॉल्यूशन सेट में दर्ज हैं और [over.best.ics] लागू होता है।

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