2013-02-25 49 views
11

आपक्या मुझे हमेशा जब भी संभव हो तो C++ 11 में 'constexpr int' के साथ 'const intpr' को प्रतिस्थापित करना चाहिए?

const int one = 1; 
const int two = 2; 
इस के साथ

की जगह चाहेंगे?

constexpr int one = 1; 
constexpr int two = 2; 

क्या मेरी समझ सही है कि दोनों ब्लॉक अर्थात् समान हैं और यह वर्तमान में केवल स्वाद का विषय है?

दूसरी तरफ, constexprconst का तात्पर्य है, आप तर्क दे सकते हैं कि यह हमेशा अधिक प्रतिबंधक रूप को पसंद करने के लिए अधिक संगत है, यहां तक ​​कि छोटी स्थितियों में भी जहां यह कोई फर्क नहीं पड़ता?

(मैं समझता हूं कि स्थिति को पूरी तरह से बदलता है जब दायीं ओर की अभिव्यक्ति को और अधिक जटिल होने की अनुमति दी जाती है। इसलिए स्पष्टीकरण के लिए, प्रश्न केवल सबसे सरल मामले पर केंद्रित होता है जहां अभिव्यक्ति एक निश्चित पूर्णांक संख्या होती है।)

+1

एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि यदि आप किसी एपीआई की तरह कुछ निर्दिष्ट कर रहे हैं, तो आप निरंतर अभिव्यक्ति को स्टोर करने के लिए 'const int 'का उपयोग करने का निर्णय ले सकते हैं क्योंकि उस संपत्ति में भविष्य के संशोधन में नहीं हो सकता है। – Pubby

उत्तर

13

मुझे लगता है कि अपने बयान करते हुए कहा कि const और constexpr संशोधित किया जाना चाहिए "शब्दार्थतः पहचान हैं": वे दोनों वस्तुओं जिसका मूल्य बदल नहीं सकते की घोषणा, लेकिन constexpr भी प्रारंभकर्ता अभिव्यक्ति की आवश्यकता है संकलन समय पर गणना कर सका हो।

अब अगर constexpr का उपयोग कर दाएं हाथ की अभिव्यक्ति संकलित समय पर गणना नहीं की जा सकती है। दूसरी ओर, जब तक प्रारंभकर्ता एक शाब्दिक है, तब तक आप constexpr का उपयोग कर सकते हैं, लेकिन ध्यान रखें कि आपके चर के अर्थशास्त्र क्या हैं: क्या आपका निरंतर चर वास्तव में कुछ ऐसा प्रतिनिधित्व करता है जिसका मूल्य संकलित करने के लिए computable हो सकता है- पहर?

एक एसडब्ल्यू रखरखाव/विकास ऑप्टिक्स में, यह संभव है कि आप अपना वैरिएबल प्रारंभ करने के तरीके को बदल दें: आज प्रारंभकर्ता एक शाब्दिक है, कल यह एक और जटिल अभिव्यक्ति हो सकता है।

जिस तरह से आप यह एक मूल्य अब बताए जाते हैं के बावजूद, आपको लगता है कि i कभी एक शाब्दिक से कुछ और से प्रारंभ करने की आवश्यकता होगी, और आरंभ अभिव्यक्ति संकलन समय पर गणना कर सका नहीं किया जा सकता है? यदि ऐसा है, तो बस अपना चर const बनाएं, भले ही आप इसे शाब्दिक रूप से प्रारंभ कर रहे हों; अन्यथा, इसे constexpr बनाएं।

दूसरे शब्दों में, क्वालीफायर चुनें जो आपके चर के अर्थशास्त्र को सबसे अच्छा व्यक्त करता है।

+2

मैं अपने सिर पर आखिरी सलाह बदलूंगा: खुद से पूछें: "क्या इस नाम को संकलन समय पर हल करने की आवश्यकता है?" (उदाहरण के लिए। मैं इसे किसी सरणी आकार या एनम मूल्य के रूप में कहीं भी उपयोग करता हूं।) यदि ऐसा है, तो 'constexpr' का उपयोग करें ताकि कोई भी इसे इस तरह से बदलने के लिए लुभाने वाला न हो जिससे नाम का उपयोग विफल हो जाए। – rici

+3

@rici: समझ में आता है, लेकिन मुझे लगता है कि ओपी ज्यादातर इस मामले से चिंतित है जब आपकी टिप्पणी में प्रश्न का उत्तर "नहीं" है। जब उत्तर "हां" होता है, निश्चित रूप से चर को 'constexpr' बनाया जाना चाहिए। लेकिन क्या होगा यदि प्रारंभकर्ता को 'कॉन्स्टेक्सप्र' अभिव्यक्ति होने की सख्ती से आवश्यकता नहीं है, और अभी यह एक होता है? यही सवाल मैंने जवाब देने की कोशिश की। –

+0

काफी उचित है, लेकिन मुझे लगता है कि "शायद" मुझे किसी शाब्दिक से अधिक जटिल द्वारा शुरू किया जाना चाहिए?", और प्रश्न का उत्तर देने में बहुत आसान है" क्या मुझे संकलन समय पर जाना जाना चाहिए? "'कॉन्स्टेक्सप्र' का उपयोग लगातार यह इंगित करने के लिए कि कोड पाठक को उपयोगी जानकारी प्रदान करता है; यह इंगित करने के लिए कि 'कल्पना' का उपयोग करके आप कल्पना करें एक संभावित contrafactual भविष्य, इतना नहीं। – rici