2011-08-24 29 views
6

यह सवाल आता है में स्थिरांक संदर्भ द्वारा पारित कर दिया है, तो यह एक से सूचक को क्षय नहीं करता है:सरणी एक टेम्पलेट समारोह

c++ pass array to function question

लेकिन मुझे लगता है कि कोई भी अब इसे पढ़ा जाएगा के बाद से ओपी एक जवाब स्वीकार कर लिया।

मैंने इस कोड को g ++ पर आजमाया। ऐसा लगता है कि जब इस समारोह के लिए पारित किया है कि सरणी एक सूचक को क्षय नहीं करता है (समारोह उचित परिणाम देता है):

#include <iostream> 

template <typename T> 
std::size_t size_of_array (T const & array) 
{ 
    return sizeof (array)/sizeof (*array); 
} 

int main() 
{ 
    int a [5]; 
    std::cout << size_of_array (a) << '\n'; 
} 

किसी अन्य उपयोगकर्ता (sharptooth) ने कहा कि वह कुलपति ++ 10 बंद इनलाइन करने के साथ पर एक ही व्यवहार किया है।

क्या कोई समझा सकता है? धन्यवाद।

+0

मेरा जंगली अनुमान यह है कि 'टी' प्रकार 'int [5]' जैसा दिखता है, इसलिए पॉइंटर को क्षय की कोई आवश्यकता नहीं है। लेकिन मैं कोई विशेषज्ञ नहीं हूँ। – Constantinius

उत्तर

12

ऐरे क्षय नहीं होता है - यह तब होता है जब प्रोग्राम इसके बिना संकलित करने में विफल रहता है। जब आप संदर्भ द्वारा एक सरणी गुजरती हैं, वहाँ बस क्षय की कोई जरूरत में किक करने के लिए है

ध्यान दें कि समारोह टेम्पलेट भी बदसूरत sizeof भाव विभाजित बिना लिखा जा सकता है:।

template <typename T, std::size_t N> 
std::size_t size_of_array(T (&array)[N]) 
{ 
    return N; 
} 

एक ग्राहक की आवश्यकता होने पर size_of_array , T और N स्वचालित रूप से टेम्पलेट मशीनरी द्वारा घटाए जाते हैं।

4

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

+0

नहीं, जब आप किसी पॉइंटर को सरणी निर्दिष्ट करते हैं- किसी सरणी के लिए पॉइंटर संकलित नहीं होगा। – Puppy

+0

@DeadMG: आप इसे पीछे की ओर पढ़ रहे हैं "पॉइंटर = सरणी" == किसी सरणी के मान पर पॉइंटर असाइन करना। मेरा मतलब वही था। –

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