पर अलग-अलग व्यवहार का कारण बनता है यह एक और "यह अच्छा कर रहा है?" जीसीसी 6.0.0 और क्लैंग 3.7.0 के बाद से सवाल अलग-अलग व्यवहार करते हैं।एक गैर-प्रकार तर्क के लिए अग्रेषण चरणीय टेम्पलेट
मान लें हम जो गैर टेम्पलेट तर्क के रूप में एक const char *
लेता है और किसी दिए गए सूचक के लिए विशेष है एक चर टेम्पलेट करते हैं:
constexpr char INSTANCE_NAME[]{"FOO"};
struct Struct{ void function() const { std::cout << __PRETTY_FUNCTION__; } };
std::ostream &operator <<(std::ostream &o, const Struct &) { return o << INSTANCE_NAME; }
template <const char *> char Value[]{"UNKNOWN"};
// spezialization when the pointer is INSTANCE_NAME
template < > Struct Value<INSTANCE_NAME>{};
ध्यान दें कि टेम्पलेट चर विशेषज्ञता के आधार पर अलग-अलग प्रकार की है। दस हम दो टेम्पलेट कार्य, एक में से प्रत्येक के एक const char *
गैर टेम्पलेट तर्क के रूप में और आगे यह चर टेम्पलेट पर ले जाता है:
template <const char *NAME> void print()
{
std::cout << Value<NAME> << '\n';
}
template <const char *NAME> void call_function()
{
Value<NAME>.function();
}
फिर, बुला अलग व्यवहार में यह कार्यों के परिणाम:
int main()
{
print<INSTANCE_NAME>();
call_function<INSTANCE_NAME>();
return 0;
}
बजना 3.7.0 प्रिंट FOO
और void Struct::function() const
(के रूप में मैं उम्मीद कर रहा था), जबकि जीसीसी 6.0.0 नीचे त्रुटि के साथ संकलित करने के लिए विफल रहता है:
सदस्य 'मान' में 'समारोह', गैर वर्ग प्रकार की है, जिसके लिए अनुरोध 'चार [8]'
मैं लगभग लगता है कि जीसीसी समारोह call_function
में चर टेम्पलेट Value
करने के लिए टेम्पलेट गैर प्रकार तर्क NAME
आगे करने में विफल रहा है और इस कारण के लिए जो 'char [8]'
प्रकार के साथ एक है unspecialized चर टेम्पलेट का चयन करता हूँ ...
यह अभिनय कर रहा है जैसे यह टेम्पलेट तर्क की प्रतिलिपि बना रहा है। यह केवल तब होता है जब ऑब्जेक्ट के सदस्य फ़ंक्शन को कॉल करते हैं, अगर हम call_function
के शरीर पर टिप्पणी करते हैं, तो आउटपुट FOO
UNKNOWN
नहीं है, इसलिए print
फ़ॉरवर्डिंग फ़ंक्शन जीसीसी में भी काम कर रहा है।
तो
- सही व्यवहार क्या है? (मील शर्त clang के लिए है)
- मैं संकलक के लिए एक बग टिकट कैसे खोल सकता हूं जो गलत कर रहा है?
@ BЈовић आप, जब तक कि 'स्थिरांक चार *' बाहरी संबंध है ([इस जवाब को देखने] (http://stackoverflow.com/a/16402606/499359)) कर सकते हैं। बाहरी संबंध के साथ यह हमेशा एक ही पता होगा; इसके बारे में सोचें जैसे कि यह 'int' था। –
बस एक नोट: 'फू', 'फू' और 'फू' नामक पूरी तरह से अलग संरचनाएं होने से मानसिक रूप से आपके उदाहरण को पार्स करना मुश्किल हो जाता है। 'माईकर्प', 'माईस्ट्रक्चर' और 'मायफन' या इसी तरह का आसान होगा। – TartanLlama
@TartanLlama मैं भी बुला बिना नाम, सुझाव के लिए धन्यवाद :) –