औपचारिक रूप से, रूपांतरण अनुक्रमों की तुलना करते समय, लैवलू परिवर्तनों को अनदेखा कर दिया जाता है। , lvalue परिवर्तन (int[N]
->int*
, void()
->void(*)()
), और अन्य - रूपांतरण की तरह योग्यता समायोजन (>T const*
T*
), कई श्रेणियों में बांटा जाता है।
आपके दो उम्मीदवारों के बीच एकमात्र अंतर एक अंतराल परिवर्तन है। स्ट्रिंग अक्षर वे सरणी हैं जो पॉइंटर्स में परिवर्तित होते हैं। पहला उम्मीदवार संदर्भ के अनुसार सरणी स्वीकार करता है, और इस प्रकार एक अंतराल परिवर्तन की आवश्यकता नहीं होगी। दूसरे उम्मीदवार को एक लालू परिवर्तन की आवश्यकता है।
तो, यदि दो उम्मीदवार हैं कि दोनों टेम्पलेट विशेषज्ञताएं केवल रूपांतरणों को देखकर समान रूप से व्यवहार्य हैं, तो नियम यह है कि दोनों का आंशिक क्रम करके अधिक विशिष्ट व्यक्ति चुना जाता है।
हम पहले पैरामीटर सूची के लिए कुछ अद्वितीय प्रकार Q
चुनते हैं, तो अपने समारोह पैरामीटर सूची
void(T const&);
void(T*);
के अपने हस्ताक्षर को देखकर दोनों के बीच तुलना और दूसरा पैरामीटर सूची के खिलाफ मैच के लिए कोशिश करते हैं, हम मिलान कर रहे हैं के खिलाफ Q
। यह असफल हो जाएगा, क्योंकि Q
एक सूचक नहीं है। इस प्रकार, दूसरा कम से कम पहले के रूप में विशिष्ट है।
यदि हम दूसरी तरफ करते हैं, तो हम Q*
से T const&
के विरुद्ध मेल खाते हैं। संदर्भ गिरा दिया गया है और अपरिवर्तनीय क्वालीफायरों को अनदेखा किया जाता है, और शेष T
Q*
बन जाता है। यह आंशिक क्रम के उद्देश्य के लिए एक सटीक मैच है, और इस प्रकार पहले उम्मीदवार के खिलाफ दूसरी की रूपांतरित पैरामीटर सूची की कटौती सफल होती है। चूंकि दूसरी दिशा (दूसरे के खिलाफ) सफल नहीं हुई, दूसरा उम्मीदवार अधिक पहले से विशिष्ट है - और इसके परिणामस्वरूप, ओवरलोड रिज़ॉल्यूशन दूसरी पसंद करेगा, अगर अन्यथा अस्पष्टता होगी।
13.3.3.2/3
में:
स्टैंडर्ड रूपांतरण अनुक्रम एस 1 मानक रूपांतरण अनुक्रम S2 अगर [तुलना में एक बेहतर रूपांतरण अनुक्रम है ...पहचान रूपांतरण अनुक्रम किसी भी गैर की किसी परिणाम को माना जाता है;]
- एस 1 (S2 का एक उचित परिणाम को विहित प्रपत्र 13.3.3.1.1 द्वारा परिभाषित किया गया, किसी भी lvalue परिवर्तन को छोड़कर में रूपांतरण दृश्यों की तुलना है -identity रूपांतरण अनुक्रम) या, यदि नहीं है कि [...]
फिर
13.3.3/1
- आईसीएसआई (एफ) को अंतर्निहित रूपांतरण अनुक्रम को इंगित करने देता है जो सूची में i-th तर्क को व्यवहार्य फ़ंक्शन के i-th पैरामीटर के प्रकार में परिवर्तित करता है F.3.3.3.1 निहित रूपांतरण अनुक्रमों को परिभाषित करता है और 13.3.3.2 परिभाषित करता है कि यह क्या परिभाषित करता है एक अंतर्निहित रूपांतरण अनुक्रम के लिए एक बेहतर रूपांतरण अनुक्रम या किसी अन्य से बदतर रूपांतरण अनुक्रम होने का मतलब है।
इन परिभाषाओं को देखते हुए, एक व्यवहार्य समारोह एफ 1 फिर अगर सभी तर्कों के लिए मैं, आईसीएसआई (एफ 1) नहीं आईसीएसआई (F2) से भी बदतर एक रूपांतरण अनुक्रम है एक व्यवहार्य समारोह F2 तुलना में एक बेहतर कार्य माना परिभाषित किया गया है, और [...]
- F1 और F2 समारोह टेम्पलेट विशेषज्ञताओं हैं, और F1 के लिए समारोह टेम्पलेट 14.5.5.2 में वर्णित आंशिक आदेश नियमों के अनुसार एफ 2 के लिए टेम्पलेट की तुलना में अधिक विशिष्ट है, या, यदि नहीं है कि , [...]
अंत में, यहां निहित रूपांतरणों की तालिका दी गई है जो मानक रूपांतरण अनुक्रम में 13.3.3.1.1/3
पर भाग ले सकते हैं।
Conversion sequences http://img259.imageshack.us/img259/851/convs.png
मजेदार, एमएसवीसी 9 डीबग प्रतीकों में "foo" फ़ंक्शन का नाम है, लेकिन जाहिर है क्योंकि यह कार्यान्वयन को पहचानता है समान है - दोनों कॉल के लिए समान कार्यान्वयन का उपयोग करता है। - दिलचस्प सवाल, वैसे भी। –
peterchen
AFAIK VC टेम्पलेट उदाहरणों को फोल्ड करता है जिसके परिणामस्वरूप समान कोड होता है। – sbi
जीसीसी (4.2.4) दोनों foo और foo को ओओ 3 तक कुछ भी करने में तत्कालता बनाता है, जहां यह इन्हें पूरी तरह से इन कार्यान्वयन के लिए पूरी तरह से बढ़ाता है और इसे इनलाइन बनाता है। –