निम्नलिखित टुकड़ा पर विचार करें:समारोह टेम्पलेट में आश्रित नाम लुकअप: बजना को खारिज कर दिया, जीसीसी स्वीकार करता
struct X { };
namespace foo {
template <class T>
void bar() { T{} < T{}; }
void operator<(const X&, const X&) {}
}
int main() {
foo::bar<X>();
}
बजना इस कोड को खारिज कर दिया, जीसीसी यह स्वीकार करता है। क्या यह एक जीसीसी बग है या यह एक क्लैंग बग है?
मुझे नहीं लगता कि यह एक बग कैसा है क्योंकि टाइप 'टी' किसी भी प्रकार का संदर्भ दे सकता है। यदि वह प्रकार 'टी' अधिभारित नहीं करता है या' <'ऑपरेटर का समर्थन नहीं करता है तो 'बार' फ़ंक्शन विफल हो जाएगा। चूंकि आपने '<' ऑपरेटर को अधिभारित कर लिया है, यह सब अच्छा है। मुझे लगता है कि यह सब नीचे चला जाता है कि कैसे कंपेलर कोड पढ़ते हैं, लेकिन अर्थशास्त्र-वार यह बग-प्रवण नहीं है। – Poriferous
@ प्रायोजक जो कोई समझ नहीं आता है। प्रश्न यह है कि 'bar()' के प्रकार का सही व्यवहार किस प्रकार 'टी' के लिए है जिसका 'ऑपरेटर <'नहीं है। सही व्यवहार या तो है: "हां, यह 'बार :: ऑपरेटर <' "(इस मामले में, क्लैंग में एक बग है) या" कोड खराब बना हुआ है "(इस मामले में, जीसीसी में एक बग है)। – Barry
इसका कोई मतलब नहीं है क्योंकि 'बार' एक फ़ंक्शन है और इसमें कोई सदस्य नहीं है' ऑपरेटर <'। चूंकि आपने 'एक्स' के लिए 'ऑपरेटर <' को परिभाषित किया है, इसलिए मैं वास्तव में नहीं देखता कि समस्या क्या है। भले ही ऑपरेटर ओवरलोड को 'एक्स'' में एम्बेडेड किया गया हो, फिर भी कोड को सही ढंग से संकलित करना चाहिए। निष्पक्ष होने के लिए, यह क्लैंग है जिसमें बग है क्योंकि ऐसा लगता है कि एक प्रकार क्या है। मेरा मतलब है, क्या आपने 'foo :: bar()' को 'foo :: bar ()' जैसे कुछ के साथ बदलने की कोशिश की है और देखें कि क्लैंग उस कोड को भी अस्वीकार करता है या नहीं? –
Poriferous