c++ - Array decay to pointers in templates -


कृपया इस कोड पर विचार करें:

  #include & lt; iostream & gt; टेम्पलेट & lt; typename T & gt; शून्य एफ (टी एक्स) {std :: cout & lt; & lt; आकारफ (टी) & lt; & lt; '\ N'; } Int main () {int सरणी [27]; च (सरणी); च & LT; decltype (सरणी) & gt; (सरणी); }  

संपादक का नोट: मूल कोड का इस्तेमाल किया typeof (array) , हालांकि, यह एक जीसीसी विस्तार है।

यह प्रिंट होगा

  8 (या 4) 108  

पहले मामले में, सरणी स्पष्ट रूप से एक संकेतक के लिए decays और टी बन जाता है int * । दूसरे मामले में, टी को int [27] के लिए मजबूर किया जाता है। क्या क्षय / प्रतिस्थापन के कार्यान्वयन को परिभाषित किया गया है? क्या प्रकार को int [27] पर लागू करने के लिए एक और अधिक सुंदर तरीका है? पैरामीटर के लिए संदर्भ प्रकार का उपयोग करें

 

टेम्पलेट & lt; typename T & gt; शून्य एफ (कॉन्स्ट टी एंड एक्स) {std :: cout & lt; & lt; sizeof (टी); }

उस स्थिति में सरणी प्रकार क्षय नहीं होगा।

इसी तरह, आप f के अपने मूल संस्करण में क्षय को भी रोका जा सकता है यदि आप स्पष्ट रूप से टेम्पलेट एग्रीमेंट T को संदर्भ-टू-एरे टाइप के रूप में निर्दिष्ट करते हैं

  f & lt; int (& amp;) [27] & gt; (सरणी);  

अपने मूल कोड का नमूना में, तर्क T को सरणी प्रकार (यानी गैर संदर्भ सरणी प्रकार, typeof या प्रकार स्पष्ट रूप से निर्दिष्ट करके), सरणी प्रकार क्षय को रोका नहीं जाएगा। जबकि T ही ऐरे प्रकार के लिए खड़े होंगे (जैसा आपने देखा था), पैरामीटर x को अभी भी एक सूचक के रूप में घोषित किया जाएगा और x का आकार अभी भी होगा सूचक आकार में मूल्यांकन करें।


Comments

Popular posts from this blog

c# - How to capture HTTP packet with SharpPcap -

php - Multiple Select with Explode: only returns the word "Array" -

php - jQuery AJAX Post not working -