जो मैं नीचे ( OLD POST के तहत ) बताता हूं , वह एक हद तक सही होना चाहिए, लेकिन इसके साथ वास्तविक समस्या यह है कि SFINAE का गलत तरीके से उपयोग किया जाता है, इसलिए मुझे अब यकीन नहीं है कि यह gcc में बग है।
एक अन्य घोषणा हमेशा सफल होनी चाहिए, आप वहां SFINAE नहीं कर सकते हैं, क्योंकि यह एक वर्ग या फ़ंक्शन घोषणा या विशेषज्ञता नहीं है (जो समझ में आता है, क्योंकि आप उपनाम नहीं कर सकते हैं)। यदि उर्फ घोषणा सफल नहीं होती है, तो प्रोग्राम बीमार है। इसलिए कंपाइलर यह मान सकता है कि यह इस मामले में कभी नहीं आएगा कि जब तक आप इस तरह के टेम्पलेट को तुरंत लागू करने के लिए मजबूर नहीं करते हैं तब तक उर्फ घोषणा सफल नहीं होती है।
इसलिए यह संकलक के लिए पूरी तरह से स्वीकार्य है कि sfinae_v_t<T,...>
वह हमेशा सोचता हैT
, क्योंकि ऐसा तब होगा, जब प्रोग्राम बीमार नहीं है। इसलिए यह देखा जाएगा, कि सभी मामलों में, जिसमें प्रोग्राम बीमार नहीं है, आंशिक विशेषज्ञता विशेषज्ञ नहीं है और जैसे कि यह आपको बताएगा कि यह बीमार है। (वह है जो क्लैंग करता है)।
मुझे नहीं लगता कि संकलक ऐसा करने के लिए मजबूर है। और अगर ऐसा नहीं होता है, और बस सोचता है "ठीक है, sfinae_v_t
कुछ प्रकार है, जो भी है।", तो यह स्पष्ट नहीं है कि यह एक पुनर्वितरण है। इसलिए मुझे लगता है कि जब तक हम उनमें से एक को तुरंत नहीं हटा देते हैं, तब तक कोई त्रुटि नहीं है।
लेकिन जब हम इसे तुरंत करते हैं तो या तो समस्या होनी चाहिए कि हमारे पास एक पुनर्वितरण है या यह कि std::enable_if
टेम्पलेट तर्क के आधार पर कार्यक्रम के कारण बीमार है। जीसीसी को उनमें से कम से कम एक को चुनना चाहिए लेकिन न तो।
यह भी पूरी तरह से बिना अधिक आसान उदाहरण के लागू नहीं होता है std::enable_if
। इसलिए मुझे अभी भी लगता है कि यह जीसीसी में एक बग है, लेकिन मैं पर्याप्त रूप से दिमाग लगा रहा हूं कि अब मैं निश्चितता के साथ नहीं कह सकता। मैं सिर्फ इतना कहूंगा, किसी को यह बतलाना चाहिए कि बग के रूप में और gcc के लोगों को इसके बारे में सोचने दें।
पुराने पोस्ट
यह gcc में एक बग है। मानक हमें फ़ंक्शन टेम्प्लेट में एक क्लास टेम्पलेट को परिवर्तित करने के लिए नियम देता है । एक फ़ंक्शन टेम्पलेट दूसरे की तुलना में अधिक विशिष्ट है यदि इसका फ़ंक्शन आंशिक फ़ंक्शन टेम्पलेट ऑर्डर में दूसरे के पहले आता है।
मैंने यहां फंक्शन्स बनाए और अब यह दावा किया है कि उन्हें कॉल करना अस्पष्ट है, इसलिए यह भी कहना होगा कि क्लास टेम्पलेट समान रूप से निर्दिष्ट हैं।
नोट: मानक को ध्यान से पढ़ने पर, मेरे सिर में संकलक क्लैंग से सहमत है।