2015-04-13 8 views
7

मैं नए सी ++ 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हो रही है से बंधा किया जा रहा है कि) यह बहुत अजीब लग रहा है।

तो, सवाल क्या है?

  • मुझे इस रनटाइम आकार वाली सरणी में सरणी-से-पॉइंटर क्षय क्यों नहीं मिल रहा है?
  • चर आकार के लिए इस्तेमाल किया क्रम आकार सरणी के प्रकार के क्रम आकार सरणी हिस्सा है या मैं त्रुटि गलत समझ रहा हूँ?
+1

ध्यान दें कि आप 'साथ VLA एक्सटेंशन का उपयोग int [एस] एक;' – Jarod42

+0

संकलक झंडे या कोड मानदंडों का एक बहुत एक क्रम आकार सरणी का उपयोग करने के ना करे। (मुझे पता है कि चेतावनी झंडे के साथ जी ++ इसे उदाहरण के लिए मना कर देता है) यह संभव है कि आपका कंपाइलर इसे टेम्पलेट के रूप में उपयोग करने से इंकार कर देता है। – Aracthor

+5

जारोड 42 की टिप्पणी पर विस्तार करने के लिए, रनटाइम आकार के सरणी प्रस्तावित किए गए थे लेकिन अंततः अंतिम सी ++ 14 मानक में शामिल नहीं थे। – user2079303

उत्तर

3

टेम्पलेट तर्क कटौती के दौरान, सरणी-से-पॉइंटर रूपांतरण का उपयोग केवल तभी किया जाता है जब फ़ंक्शन टेम्पलेट पैरामीटर का प्रकार कोई संदर्भ न हो।

§14.8.2.1 एक समारोह कॉल [temp.deduct.call]

1 खाका तर्क कटौती प्रत्येक कार्य टेम्पलेट पैरामीटर प्रकार की तुलना द्वारा किया जाता है से टेम्पलेट तर्क बात का अनुमान लगाना (यह P कहते हैं) जैसा कि नीचे वर्णित कॉल की इसी तर्क के प्रकार के साथ (यह A कहते हैं)। [...

  • तो A एक सरणी प्रकार, सूचक प्रकार सरणी-टू-सूचक मानक रूपांतरण (4.2) द्वारा निर्मित है के लिए A के स्थान पर प्रयोग किया जाता है:]

    2 यदि P एक संदर्भ प्रकार नहीं है प्रकार कटौती; अन्यथा,

  • [...]
संबंधित मुद्दे