2015-03-08 18 views
6

std::array<int,0>, आकार शून्य की सरणी का क्या अर्थ है?std :: आकार शून्य का सरणी

मैं इसे पोस्ट करने से पहले SO में समान प्रश्नों से गुजर चुका हूं, और उन सभी प्रश्न सरल सरणी प्रकार और सी भाषा के लिए हैं और उनमें से अधिकतर कहते हैं कि यह अवैध है। लेकिन सी ++ array<int,0> में अनुमति है।

प्रति cppreference.com

वहाँ एक शून्य लंबाई सरणी (एन == 0) के लिए एक विशेष मामला है। उस स्थिति में, array.begin() == array.end(), जो कुछ अद्वितीय मूल्य है। शून्य आकार के सरणी पर front() या back() पर कॉल करने का प्रभाव अपरिभाषित है।

इसे अवैध क्यों नहीं माना जाता है?

+7

क्योंकि टेम्पलेट कोड इस तरह से कुछ फायदा उठा सकता है। – sbabbi

+2

यह अवैध क्यों होना चाहिए? अगर मैं स्पष्ट रूप से उस मामले को 'सरणी' संभालने की बजाय शून्य आकार के सरणी से बचने के लिए अपने कोड में विशेष मामलों को जोड़ना चाहता हूं तो मुझे परेशान होना पड़ेगा। –

+0

@ माइकसेमोर 'int x [0]; * * अवैध है। मुझे लगता है कि सवाल यह है कि अंतर क्यों है। – Angew

उत्तर

9

std :: array, आकार शून्य की सरणी का क्या अर्थ है?

उदाहरण के लिए एक खाली std::vector या खाली std::set

इसे अवैध क्यों नहीं माना जाता है?

यह है वांछनीय बनाने के लिए यह कानूनी इसका मतलब है कि सामान्य प्रोग्रामिंग एक विशेष मामले को संभालने के लिए जब std::array के आकार एक संकलन समय गणना का परिणाम है नहीं होने के कारण।

यह संभव इसे टेम्पलेट विशेषज्ञता के लिए कानूनी धन्यवाद के रूप में परिभाषित करने के लिए है। उदाहरण के लिए, कार्यान्वयन कि विजुअल C++ के साथ आता है std::array माहिर एक फैशन निम्न के समान में:

template<class T> 
class array<T, 0> // specialisation 
{ 
    // ... 

    size_type size() const 
    { 
     return 0; 
    } 

    T elements[1]; // the raw array cannot have a size of 0 
}; 

मैं हर संकलक लागू करता std::array ऐसा लगता है।

+0

इस तरह टेम्पलेट विशेषज्ञता? क्या अनावश्यक नकल, हमारे पास इसके लिए सशर्त ऑपरेटर है। – Deduplicator

+2

यह एक आश्चर्यजनक कार्यान्वयन है। जब मैं शून्य 'टी' की सरणी मांगता हूं तो डिफ़ॉल्ट रूप से' टी' का निर्माण होता है ... विषम। –

+0

@ टी.सी.: ठीक है, इसे सीधे वास्तविक वीसी हेडर फ़ाइल से बाहर ले जाया गया है ... –

2

std :: array को अन्य मानक कंटेनर की तरह माना जाता है जो खाली हो सकते हैं। इसलिए std::array का विशेषज्ञता एन बराबर शून्य के साथ एक खाली कंटेनर परिभाषित करता है।

+0

एक तरफ के रूप में, यह * कभी * खाली प्रकार नहीं है ... – Deduplicator

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