2012-05-08 20 views
8

यह प्रश्न उन कार्यों के बारे में है जो स्थिर रूप से ज्ञात आकार के सरणी लेते हैं।टेम्पलेट पैरामीटर कटौती में int [5] और int (& a) [5] के बीच अंतर

उदाहरण के लिए निम्नलिखित न्यूनतम कार्यक्रम लें:

#include <iostream> 

template<size_t N> 
void arrfun_a(int a[N]) 
{ 
    for(size_t i = 0; i < N; ++i) 
     std::cout << a[i]++ << " "; 
} 

int main() 
{ 
    int a[] = { 1, 2, 3, 4, 5 }; 
    arrfun_a<5>(a); 
    std::cout << std::endl; 
    arrfun_a<5>(a); 

    return 0; 
} 

कौन सा है, जब चलाने के लिए, अपेक्षित परिणाम प्रिंट:

2 3 4 5 6 
3 4 5 6 7 

हालांकि, जब मैं अपने संकलक (वी.एस. 2010) करने की कोशिश की अनुमान 5, यह could not deduce template argument for 'int [n]' from 'int [5]' है।

अनुसंधान के एक बिट अद्यतन arrfun_b में हुई जहां टेम्पलेट पैरामीटर कटौती काम करता है:

template<size_t n> 
void arrfun_b(int (&a)[n]) 
{ 
    for(size_t i = 0; i < n; ++i) 
     std::cout << ++(a[i]) << std::endl; 
} 

कार्यक्रम का परिणाम एक ही है, arrfun_a या arrfun_b कहा जाता है या नहीं।

अब तक, फर्क सिर्फ इतना है कि मैं पाया है टेम्पलेट तर्क कटौती से काम करता है कि क्या है और अगर यह संभव है एक एन कि 5 नहीं है के साथ समारोह ...

+2

क्या आप वाकई सुनिश्चित हैं कि 'दोनों संस्करण स्पष्ट रूप से एन को पारित करने की अनुमति देते हैं जो छोटा या बड़ा है'? यह मेरे लिए नहीं [और नहीं] (http://ideone.com/74FaV) होना चाहिए। और यह संदर्भ संस्करण का उपयोग करने के लिए एक और _pro_ है – Lol4t0

+0

मेरे भ्रम को ठीक करने के लिए धन्यवाद! परीक्षण के दौरान किसी जगह पर, मुझे उस के साथ खराब होना चाहिए! –

+0

आपने गैर-संदर्भ संस्करण को नहीं हटाया और एक अधिभार बनाया, जिसे कहा जाता था। – Lol4t0

उत्तर

14

संकलक चुपचाप के प्रकार में परिवर्तन कॉल करने के लिए फ़ंक्शन तर्क int a[N] से int *a और इस प्रकार सरणी का आकार खो देता है। int(&a)[5] वास्तव में आकार 5 की सरणी का संदर्भ है, और किसी अन्य आकार की सरणी पारित नहीं की जा सकती है।

+5

और अधिक महत्वपूर्ण बात यह है कि, एक पैरामीटर सूची में int [5] 'int * a' बन जाता है जहां' int (& a) [5] 'वास्तव में एक ** संदर्भ ** है जो 5' int की –

+1

@D की सरणी में है। शॉली, मैंने निहित किया लेकिन इसे स्पष्ट नहीं किया। धन्यवाद। –

+0

उस स्थिति में, 'arrfun_a' पर कॉल में एक सरणी-से-पॉइंटर क्षय शामिल होगा, जिसके बाद एक पूर्ण सूचक-से-सर-पांच रूपांतरण होगा, जिससे मुझे पूरी तरह बेकार संकलक संदेश मिल जाएगा? * महान * –

1

मुझे लगता है कि यह एक संदर्भ और एक सूचक के बीच का अंतर है।

arrfun_a int के लिए एक सूचक पास करता है।

arrfun_b इनट्स की एक सरणी के संदर्भ को पास करता है।