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