2011-04-09 27 views
5

इन दोनों के बीच क्या अंतर है? जब आप निरंतर मानों की एक निश्चित आकार सरणी की आवश्यकता होती है तो आप कौन सा पसंद करेंगे?const boost :: array <T,N> या boost :: array <const T,N>?

const boost::array<int, 2> x = {0, 1}; 
boost::array<const int, 2> y = {0, 1}; 

धन्यवाद। इस संदर्भ में

उत्तर

6

दूसरा एक पाएगा कि आप इसे एक नया गैर स्थिरांक सरणी

boost::array<const int, 2> y = {0, 1}; 
boost::array<int, 2> y1 = y; // error! 

को कॉपी के बाद से मुझे लगता है कि काम करने के लिए उम्मीद करेंगे, मैं शायद पहले विकल्प के साथ जाना होगा। दूसरे को टेम्पलेट्स में पास करना जो boost::array<T, N> की अपेक्षा करता है, उन टेम्पलेट्स को उनके पैरामीटर को संशोधित करने से रोक देगा (भले ही यह एक प्रतिलिपि हो)। पहला वाला "बस काम करेगा", क्योंकि पैरामीटर के प्रकार boost::array<int, 2> होगा।

+0

धन्यवाद! बीटीडब्ल्यू, क्यों मूल्य उपेक्षा कॉन क्वालिफायर द्वारा पास? क्या यह तर्क प्रकार कटौती कैसे काम करता है? – pic11

+0

@pic हाँ। ऐसा लगता है कि यह एक अच्छी बात है। Http://cpp-next.com/archive/2011/04/appearing-and-disappearing-consts-in-c/ –

+0

Schaub पर टिप्पणियां देखें। हाँ, यह सही समझ में आता है। लिंक के लिए धन्यवाद। – pic11

0

const int और int बहुत अधिक समान हैं। array<int,2> पर आप कुछ भी नहीं कर सकते हैं कि आप array<const int, 2> पर नहीं कर सकते हैं। यदि int के बजाय आपके पास कुछ कक्षा है तो एक अंतर होगा। array<const MyClass, 2> के साथ आप सरणी के तत्वों पर गैर-कॉन्स्ट विधियों को कॉल करने में सक्षम नहीं होंगे।
const array<MyClass, 2> इतना मजबूत है कि आप जो भी कुछ भी संशोधित नहीं कर सकते हैं। आप और तत्वों के गैर-कॉन्स्ट विधियों को कॉल नहीं कर सकते हैं, आप operator[] का उपयोग करके तत्वों को प्रतिस्थापित करके सरणी को स्वयं नहीं बदल सकते हैं।

+0

आप अन्य विकल्प के तहत तत्वों को 'ऑपरेटर []' के माध्यम से प्रतिस्थापित नहीं कर सकते हैं। – Potatoswatter

2

यह वास्तव में एक स्टाइलिस्ट अंतर है।

यदि आप assign पर const array पर कॉल करने का प्रयास करते हैं, तो संकलक त्रुटि कहती है कि कोई मिलान कार्य नहीं है। यदि आप array<const T> के साथ ऐसा करते हैं, तो यह assign के अंदर अमान्य ऑपरेशन पर इंगित करता है।

मुझे लगता है कि const array इरादा बेहतर व्यक्त करता है, और इसी सी-शैली सरणी घोषणा की तरह दिखता है। लेकिन मैं चीजों को बदलने का प्रयास नहीं करता, उदाहरण के लिए विरासत कोड या टेम्पलेट के अंदर जो array<const T> उत्पन्न कर सकता है।

+0

मैं ** कॉन्स सरणी ** के साथ जाऊंगा। धन्यवाद। – pic11

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