मैं नए सी ++ 14 क्रम आकार सरणियों से अधिक type_traits
शीर्षक में उपकरणों में से कुछ का परीक्षण किया गया था, नीचे दिए गए कोड पर विचार करें:रनटाइम सरणियों और सूचक क्षय आकार
int g[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
template <typename T> void print(T &t)
{
std::cout << "Type id: " << typeid(T).name() << '\n';
std::cout << "is_array: " << std::is_array<decltype(T)>::value << '\n';
std::cout << "is_pointer: " << std::is_pointer<decltype(T)>::value << '\n';
std::cout << "extent: " << std::extent<decltype(T)>::value << '\n';
}
int main()
{
print(g);
return 0;
}
स्थिर आकार सरणी g
रिटर्न निम्नलिखित उत्पादन:
Type id: A11_i
is_array: 1
is_pointer: 0
extent: 11
unmangled नाम A11_i
मैं यह सोचते हैं रहा है कि है प्रकार के तत्वों का एक rray पूर्णांक तो सब यहाँ सही है, लेकिन इस नए कोड के साथ:
In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'
note: candidate is:
note: template<class T> void print(T&)
note: template argument deduction/substitution failed:
note: variable-sized array type 'int [s]' is not a valid template argument
मैं उम्मीद नहीं थी कि आकार तर्क टेम्पलेट के लिए पारित किया जा सकता है:
void f(std::size_t s)
{
int a[s];
print(a);
}
int main()
{
f(5);
return 0;
}
मैं हो रही त्रुटियों कर रहा हूँ लेकिन मैं एक स्वचालित सरणी से पॉइंटर क्षय की उम्मीद कर रहा था। मुझे लगता है कि आपको उस कथन T &
क्षय के इस प्रकार के लिए अनुकूल तो मैं करने के लिए टेम्पलेट हस्ताक्षर बदलने के लिए कोशिश की है नहीं है: इसी तरह के परिणाम के साथ
template <typename T> void print(T *&t)
:
In function 'void f(std::size_t)':
error: no matching function for call to 'print(int [s])'
note: candidate is:
note: template<class T> void print(T*&)
note: template argument deduction/substitution failed:
note: mismatched types 'T*' and 'int [s]'
और मैंने देखा है क्रम आकार सरणी पर आकार चर का प्रकार (बजाय mismatched types 'T*' and 'int [
5
]'
हम mismatched types 'T*' and 'int [
s
हो रही है से बंधा किया जा रहा है कि) यह बहुत अजीब लग रहा है।
तो, सवाल क्या है?
- मुझे इस रनटाइम आकार वाली सरणी में सरणी-से-पॉइंटर क्षय क्यों नहीं मिल रहा है?
- चर आकार के लिए इस्तेमाल किया क्रम आकार सरणी के प्रकार के क्रम आकार सरणी हिस्सा है या मैं त्रुटि गलत समझ रहा हूँ?
ध्यान दें कि आप 'साथ VLA एक्सटेंशन का उपयोग int [एस] एक;' – Jarod42
संकलक झंडे या कोड मानदंडों का एक बहुत एक क्रम आकार सरणी का उपयोग करने के ना करे। (मुझे पता है कि चेतावनी झंडे के साथ जी ++ इसे उदाहरण के लिए मना कर देता है) यह संभव है कि आपका कंपाइलर इसे टेम्पलेट के रूप में उपयोग करने से इंकार कर देता है। – Aracthor
जारोड 42 की टिप्पणी पर विस्तार करने के लिए, रनटाइम आकार के सरणी प्रस्तावित किए गए थे लेकिन अंततः अंतिम सी ++ 14 मानक में शामिल नहीं थे। – user2079303