2010-08-07 19 views
7

करता है सी ++ मानक गारंटी निम्नलिखित ?:सी ++ मानक, समारोह संकल्प अतिभारित/मिलान

template<typename T> 
void function(T (&)[1]); 

template<typename T> 
void function(T*); 

int a[1]; 
function(a); // first function gets called, not second version 
+0

मैं भी जानना चाहता हूं। – zneak

+2

अच्छा सवाल है, लेकिन सवाल के लिए विषय इतना ज्यादा नहीं है। क्या आपको लगता है कि आप इसे अधिक प्रासंगिक बना सकते हैं, जैसे "पैरामीटर प्रकार टी (&) [1] उदाहरण के लिए सी ++ टेम्पलेट्स में सरणी के लिए टी * से बेहतर मिलान है। बीटीडब्ल्यू, मुझे यकीन नहीं है कि अगर ओवरलोडिंग के साथ इसका कोई संबंध नहीं है। –

+0

@Mac मैंने विषयों को थोड़ा बदल दिया, क्या यह बेहतर है? – Anycorn

उत्तर

6

हाँ, यह गारंटी है, लेकिन क्या कारण GMAN कहते हैं से अलग है। "लम्बाई 1" अधिभार का चयन किया जाएगा क्योंकि यह टेम्पलेट कार्यों आंशिक क्रम में दूसरे से अधिक विशिष्ट है। असल में, इसका मतलब है कि फॉर्म T(&)[1] में एक तर्क हमेशा T* रूप में दूसरे टेम्पलेट तर्क से मेल खाता है, इसलिए पहला अनुक्रम हमेशा चुना जाएगा जब रूपांतरण अनुक्रम निर्णय नहीं लेते हैं।

13.3.3 से:

इन परिभाषाओं को देखते हुए, एक व्यवहार्य समारोह एफ 1 यदि सभी तर्कों के लिए मैं, आईसीएसआई (एफ 1) है एक व्यवहार्य समारोह F2 तुलना में एक बेहतर समारोह होने के लिए परिभाषित किया गया है आईसीएसआई (F2) से नहीं एक बुरा रूपांतरण अनुक्रम, और फिर

  • कुछ तर्क जे के लिए, ICSj (एफ 1) (F2) ICSj तुलना में एक बेहतर रूपांतरण अनुक्रम है, या, यदि ऐसा नहीं है कि,

  • एफ 1 एक गैर टेम्पलेट समारोह है और F2 एक टेम्पलेट समारोह विशेषज्ञता, या, है न कि अगर,

  • F1 और F2 टेम्पलेट काम करता है, और के लिए समारोह टेम्पलेट हैं एफ 1 अधिक tem- प्लेट से F2 के लिए विशेष है 14.5.5.2, में वर्णित आंशिक आदेश नियमों के अनुसार या, नहीं है कि अगर,

...

012,351,

सामान्य कार्य केवल पहले आइटम से प्रभावित होते हैं; जब कोई टेम्पलेट फ़ंक्शन उम्मीदवार फ़ंक्शंस के सेट में होते हैं, तो दूसरा या तीसरा आइटम तय कर सकता है। हम इसे इस तरह से चाहते हैं कि हम प्रतीत होता है अस्पष्ट templated अधिभार लिखने में सक्षम होना चाहते हैं। उदाहरण के लिए।

template <class T> void f(T); 
template <class T> void f(T*); 

अन्यथा int* के लिए अस्पष्ट होगा। C++ 0x में, आप भी तरह घोषणाओं लिख सकते हैं:

template <class ...Ts>   void f(const Ts&... args); 
template <class T, class ... Ts> void f(const T& a, const Ts&... args); 

और जब भी कम से कम एक तर्क है दूसरा चयन किया जाएगा।

+0

मेरे हटाए गए उत्तर पर @aaa से: @jpa तो, टेम्पलेट की उपस्थिति एक बड़ा अंतर बनाती है? – GManNickG

+0

@GMan: हाँ, संपादन देखें। – jpalecek

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