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