इस कोड पर विचार करें:सरणी क्षय
#include <iostream>
template<typename T>
void f(T x) {
std::cout << sizeof(T) << '\n';
}
int main()
{
int array[27];
f(array);
f<decltype(array)>(array);
}
संपादक का ध्यान दें: मूल कोड का इस्तेमाल किया typeof(array)
, हालांकि कि एक जीसीसी विस्तार है।
यह
8 (or 4)
108
प्रिंट होगा पहले मामले में, सरणी स्पष्ट रूप से एक सूचक को decays और टी int*
हो जाता है। दूसरे मामले में, टी को int[27]
पर मजबूर किया गया है। क्षय/प्रतिस्थापन कार्यान्वयन का आदेश परिभाषित किया गया है? क्या int[27]
पर बल को मजबूर करने का एक और शानदार तरीका है? Std :: वेक्टर का उपयोग करने के अलावा?
आपको सी ++ कंपाइलर कहां मिला जहां 'sizeof (int) == 1'? मुझे दूसरी कॉल के लिए 108 मिलते हैं। –
हां, ज़ाहिर है कि जीसीसी पहले से ही 4 बाइट इन्स तक चली गई है ;-) मैंने टेस्टकेस उत्पन्न करते समय एक बग पेश किया है। – hirschhornsalz
मैं दूसरी कॉल संकलन आश्चर्यचकित हूं। आप सी ++ में मान द्वारा सरणी पास नहीं कर सकते हैं। [संपादित करें: आह, 'टी' में सरणी प्रकार है, लेकिन 'sizeof (x)' अभी भी 8 या 4 आउटपुट करेगा। कभी भी ध्यान न दें। :)] –