2017-02-16 20 views
9

मान लीजिए क्यों f(new int)f(const T&) बजाय f(const T*) पर ले कर जाता है मैं एक समारोहगैर स्थिरांक सूचक स्थिरांक टी *

template <typename T> 
void f(const T&) { 
    cout << "f(T&)" << endl; 
} 

template <typename T> 
void f(const T*) { 
    cout << "f(T*)" << endl; 
} 

के दो भार के संबंध के लिए स्थिरांक टी एंड अधिभार पसंद? इस काउंटर-सहज व्यवहार के बारे में मानक वार्ता में कहीं भी?

http://ideone.com/kl8NxL

+4

'च (के अनुसार जीतता नया int) ''टी' सेट 'int *' के साथ' f (const t &) 'को 'int'' के साथ हल करता है, 'टी' सेट 'int' के साथ नहीं। ऐसा लगता है कि आप हस्ताक्षर के साथ एक समारोह बुला रहे हैं। 'एफ (int * const &);' –

+0

मुझे यह हिस्सा पता था। मेरा सवाल है, 'एफ (int * const &)' f (const int *) 'से बेहतर मिलान क्यों है? –

उत्तर

13

टेम्पलेट कटौती के साथ अधिभार समाधान के लिए, पहला कदम टेम्पलेट्स को हल करने के लिए है। फिर नॉन-टेम्पलेट ऑर्डरिंग परिणामों पर लागू होती है। अपने कोड में टेम्पलेट संकल्प हैं:

void f(int * const &) // 1 

void f(int const *)  // 2 

के अनुसार सी ++ 14 [over.ics.ref], एक संदर्भ के रूप में एक बहस के लिए सीधे बंधन (1) एक पहचान रूपांतरण (भले ही है सीवी-क्वालीफायर जोड़े गए हैं)। T से T const & का बाध्यकारी प्रत्यक्ष बाध्यकारी है, यानी कोई अस्थायी नहीं बनाया गया है और बाध्य है।

हालांकि, (2) योग्यता रूपांतरण शामिल है। फ़ंक्शन पैरामीटर से मेल खाने से पहले तर्क प्रकार int * को const int * में परिवर्तित किया जाना चाहिए।

पहचान रूपांतरण किसी भी गैर-पहचान रूपांतरण अनुक्रम की एक उप-अनुक्रम में माना जाता है, इसलिए (1) उप अनुक्रम नियम [over.ics.rank] /3.1.1

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