2016-05-18 14 views
12

मुझे ऋणात्मक-आकार सरणी बनाने का प्रयास करने में त्रुटि क्यों नहीं मिली?नकारात्मक आकार के सरणी के लिए कोई त्रुटि

#include <array> 

int main() 
{ 
    std::array<int, -1> arr; 
} 

-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC के साथ मुझे कोई त्रुटि नहीं है। क्या यह इरादा व्यवहार है?

+2

कौन सा संकलक आप उपयोग कर रहे:

बजना में आप की उम्मीद त्रुटि संदेश मिलता है? मैंने जीसीसी 5.3.1 का उपयोग किया और मुझे त्रुटि मिली 'चर का आकार' एआर 'बहुत बड़ा है' –

उत्तर

8

std::array प्रकार है:

template< 
    class T, 
    std::size_t N 
> struct array; 

जब आप -1 के साथ दूसरे टेम्पलेट पैरामीटर प्रारंभ, यह परोक्ष एक बहुत बड़े मूल्य में बदल जाती है के रूप में std::size_tunsigned (जो सी में गैर कानूनी है ++ के रूप में other answer और इसके द्वारा बताया है निदान किया जाना चाहिए)।

एक और संभावना यह है कि आपके arr को अनुकूलित किया गया है। आप gcc कमांड लाइन में -fdump-tree-optimized ध्वज जोड़कर इसकी पुष्टि कर सकते हैं।

आप यह सुनिश्चित करते हैं arr बाहर अनुकूल नहीं है, मुझे आशा है कि आप following warning मिलना चाहिए:

prog.cpp:5:25: error: size of variable 'arr' is too large 
    std::array<int, -1> arr; 
+1

ऐसी चेतावनी जांच के बाद अनुकूलन नहीं होता है? – BartoszKP

+1

@ BartoszKP मैंने 'gcc --std = C++ 11 -O2 -fdump-tree-optimized arr_que.cpp' का उपयोग किया और पुष्टि की कि कोड को केवल 'वापसी 0' के लिए अनुकूलित किया गया है, जैसा कि आप उम्मीद कर सकते हैं। मुझे यकीन नहीं है कि टेम्पलेट पैरामीटर दुरुपयोग का निदान होना चाहिए या नहीं। –

19

नहीं यह कानूनी नहीं है। std::array के विनिर्देशन के बारे में कुछ भी नहीं है जो स्पष्ट रूप से इसे रोकता है, लेकिन रूपांतरणों को कम करने के कारण यह अवैध है।

§14.3.2/5:

अभिन्न या गणना प्रकार के गैर-प्रकार टेम्पलेट पैरामीटर के लिए, रूपांतरण एक परिवर्तित निरंतर अभिव्यक्ति (5.19) में अनुमति दी लागू होते हैं।

§5.19/3:

एक परिवर्तित प्रकार टी के निरंतर अभिव्यक्ति एक शाब्दिक निरंतर अभिव्यक्ति है, परोक्ष टाइप करने के लिए टी, जहां अंतर्निहित रूपांतरण (यदि हो तो) एक में अनुमति दी है परिवर्तित शाब्दिक निरंतर अभिव्यक्ति और निहित रूपांतरण अनुक्रम में केवल उपयोगकर्ता परिभाषित रूपांतरण, lvalue-to-rvalue रूपांतरण (4.1), अभिन्न प्रचार (4.5), और अभिन्न रूपांतरण (4.7) रूपांतरण (8.5.4)

को संकुचित करने के अलावा अन्य शामिल हैं

शिकायत करने के लिए जीसीसी प्राप्त करने का एकमात्र तरीका -Wsign-conversion सक्षम करना है। यह known bug है और उन्होंने इसे ठीक करने के लिए कोई आंदोलन नहीं किया है।

error: non-type template argument evaluates to -1, which cannot be 
narrowed to type 'std::size_t' (aka 'unsigned long') [-Wc++11-narrowing] 
    std::array<int, -1> arr; 
+1

ऐतिहासिक नोट: प्रकाशित सी ++ 11 में यह कार्यान्वयन-परिभाषित किया गया था कि यह एक संकुचित रूपांतरण था, लेकिन यह डीआर 1449 द्वारा हमेशा संकुचित होने के लिए तय किया गया था –

संबंधित मुद्दे