2016-08-12 23 views
9

क्या कोई समझा सकता है कि ओवरलोडिंग रिज़ॉल्यूशन एक अस्पष्ट त्रुटि की रिपोर्ट करने के बजाय दूसरा फ़ंक्शन क्यों लेगा। वैसे भी, दूसरा कार्य एक सटीक मैच है, लेकिन पहले एक योग्यता रूपांतरण (char * से const char * तक) से गुजरता है। हालांकि, http://en.cppreference.com/w/cpp/language/overload_resolution
का दस्तावेज़ बताता है कि योग्यता रूपांतरण भी एक सटीक मिलान है, और इसलिए दोनों उम्मीदवारों के पास समान रैंकिंग होना चाहिए।सी ++ फ़ंक्शन ओवरलोडिंग सटीक मिलान

1) सटीक मिलान::

मानक रूपांतरण अनुक्रम के प्रत्येक प्रकार के तीन पंक्तियां एक असाइन किया गया है कि कोई भी रूपांतरण की आवश्यकता है, lvalue करने वाली rvalue रूपांतरण, योग्यता रूपांतरण, समारोह सूचक रूपांतरण, (के बाद से सी + +17) उपयोगकर्ता परिभाषित एक ही कक्षा

2) संवर्धन करने के लिए वर्ग प्रकार के रूपांतरण: अभिन्न पदोन्नति, फ्लोटिंग प्वाइंट पदोन्नति

3) रूपांतरण: अभिन्न रूपांतरण, फ्लोटिंग प्वाइंट रूपांतरण, चल अभिन्न रूपांतरण, सूचक रूपांतरण, पॉइंटर-टू-मेम्ब एर रूपांतरण, बूलियन रूपांतरण, एक व्युत्पन्न वर्ग के उपयोगकर्ता परिभाषित रूपांतरण इसके आधार

void g(const char* x) 
{ 
    std::cout << "g(const char* x)" << std::endl; 
} 

void g(char* x) 
{ 
    std::cout << "g(char* x)" << std::endl; 
} 

void callg() 
{ 
    char a[] = "sample"; 
    g(a); 
} 

उत्तर

8

के दोनों कार्यों एक सरणी-टू-सूचक रूपांतरण की आवश्यकता होती है, लेकिन पहले एक अतिरिक्त योग्यता रूपांतरण की आवश्यकता है।

आप कह रही है कि दोनों एक सटीक मिलान कर रहे हैं में सही कर रहे हैं

[over.ics.scs]/3

[...] एक रूपांतरण अनुक्रम के पद पर विचार से निर्धारित होता है अनुक्रम में प्रत्येक रूपांतरण का रैंक और किसी भी संदर्भ बाध्यकारी के रैंक (13.3.3.1.4)। यदि उनमें से किसी के पास रूपांतरण रैंक है, तो अनुक्रम में रूपांतरण रैंक है; अन्यथा, अगर उनमें से किसी को पदोन्नति रैंक है, तो अनुक्रम में पदोन्नति रैंक है; अन्यथा, अनुक्रम में सटीक मिलान रैंक है।

लेकिन [over.ics.rank] में/3,2

स्टैंडर्ड रूपांतरण अनुक्रम नियमों के अनुसार S1 मानक रूपांतरण अनुक्रम S2 अगर

[तुलना में एक बेहतर रूपांतरण अनुक्रम है ... ]

(3.2.5) - S1 और S2 केवल उनके योग्यता रूपांतरण में भिन्न है और इसी प्रकार के प्रकार T1 और T2 (4.4) क्रमशः, और T1 के सीवी-योग्यता हस्ताक्षर T2 के सीवी-योग्यता हस्ताक्षर का उचित सबसेट है।

यही नियम पेज आप

3) एक मानक रूपांतरण अनुक्रम S1बेहतर एक मानक रूपांतरण अनुक्रम से कि "निहित रूपांतरण दृश्यों के रैंकिंग" के अंतर्गत लिंक पर है S2 अगर

[...]

च) या, यदि ऐसा नहीं है कि, S1 और S2 केवल योग्यता रूपांतरण में मतभेद है, और S1 का परिणाम के सीवी-योग्यता S2

+0

मैं समझने में सक्षम नहीं था "आप यह कहने में सही हैं कि दोनों एक सटीक मैच हैं" कैसे? –

+0

@GilsonPJ आवश्यक रूपांतरणों (सरणी से पॉइंटर और योग्यता) के रैंक सटीक मिलान हैं, इसलिए समग्र रूपांतरण अनुक्रम भी सटीक मिलान हैं। – user657267

+0

@ गिल्सन: असल में, दोनों सटीक मिलान हैं और एक ही रैंक है ... लेकिन सीवी-योग्यता के संबंध में विशेष नियम ट्रम्प करता है और # 2 प्राथमिकता देता है। संक्षेप में: ** यह सिर्फ ** है। –

0
का परिणाम के सीवी-योग्यता का एक सबसेट है

ओवरलोड रिज़ॉल्यूशन टी * और कॉन्स टी * में विशिष्ट पैरामीटर प्रकार माना जाता है। [over.load] 13.1/(3.4):

विशेष रूप से, किसी भी प्रकार की टी, "टी करने के लिए सूचक", "अस्थिर टी करने के लिए सूचक" "सूचक const करने के लिए टी", और के लिए अलग पैरामीटर माना जाता है प्रकार, जैसे "टी के संदर्भ", "कॉन्स्ट टी के संदर्भ" और "अस्थिर टी के संदर्भ" हैं।

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