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
Post a Comment