संक्षिप्त उत्तर यह है कि न केवल static
उपयोगी है, यह हमेशा अच्छी तरह से वांछित होने वाला है।
सबसे पहले, ध्यान दें कि static
और constexpr
एक दूसरे से पूरी तरह से स्वतंत्र हैं। static
निष्पादन के दौरान ऑब्जेक्ट के जीवनकाल को परिभाषित करता है; constexpr
निर्दिष्ट करता है कि संकलन के दौरान ऑब्जेक्ट उपलब्ध होना चाहिए। संकलन और निष्पादन समय और स्थान दोनों में असहमति और असहमति है। इसलिए एक बार कार्यक्रम संकलित करने के बाद, constexpr
अब प्रासंगिक नहीं है।
हर चर घोषित constexpr
परोक्ष है const
लेकिन const
और static
लगभग ओर्थोगोनल (के साथ बातचीत के अलावा static const
पूर्णांकों।)
C++
ऑब्जेक्ट मॉडल (§1.9) कि अन्य सभी से थोड़ा-क्षेत्रों स्मृति के कम से कम एक बाइट पर कब्जा और पते हैं वस्तुओं की आवश्यकता है; इसके अलावा, एक निश्चित समय पर एक कार्यक्रम में सभी ऐसी वस्तुओं का अलग-अलग पता होना चाहिए (पैराग्राफ 6)। स्थानीय गैर-स्थिर स्थिरांक के साथ फ़ंक्शन के हर आह्वान के लिए स्टैक पर एक नया सरणी बनाने के लिए कंपाइलर की बहुत आवश्यकता नहीं होती है, क्योंकि कंपाइलर as-if
सिद्धांत की शरण ले सकता है बशर्ते यह साबित कर सके कि ऐसी कोई अन्य वस्तु नहीं हो सकती है देखे गए।
यह साबित करना आसान नहीं है, दुर्भाग्य से, जब तक कि फ़ंक्शन तुच्छ नहीं है (उदाहरण के लिए, यह किसी अन्य फ़ंक्शन को नहीं कहता है जिसका शरीर अनुवाद इकाई के भीतर दिखाई नहीं देता है) क्योंकि सरणियाँ, परिभाषा से अधिक या कम, पते हैं। इसलिए ज्यादातर मामलों में, गैर-स्थैतिक const(expr)
सरणी को हर आह्वान पर स्टैक पर फिर से बनाना होगा, जो संकलन समय पर इसे पूरा करने में सक्षम होने के बिंदु को हरा देता है।
दूसरी ओर, static const
सभी पर्यवेक्षकों द्वारा एक स्थानीय वस्तु साझा की जाती है, और इसके बाद भी इसे आरंभीकृत किया जा सकता है, भले ही इसे जिस फ़ंक्शन में परिभाषित किया गया हो उसे कभी नहीं कहा जाता है। तो उपरोक्त में से कोई भी लागू नहीं होता है, और एक संकलक स्वतंत्र है न केवल इसका केवल एक उदाहरण उत्पन्न करने के लिए; यह केवल पढ़ने के लिए भंडारण में इसका एक भी उदाहरण उत्पन्न करने के लिए स्वतंत्र है।
इसलिए आपको static constexpr
अपने उदाहरण में निश्चित रूप से उपयोग करना चाहिए ।
हालाँकि, एक ऐसा मामला है जहाँ आप उपयोग नहीं करना चाहेंगे static constexpr
। जब तक एक constexpr
घोषित वस्तु या तो ओडीआर-उपयोग या घोषित नहीं होती है static
, तब तक संकलक इसे शामिल नहीं करने के लिए स्वतंत्र है। यह बहुत उपयोगी है, क्योंकि यह constexpr
अनावश्यक बाइट्स के साथ संकलित कार्यक्रम को प्रदूषित किए बिना संकलन-समय अस्थायी सरणियों के उपयोग की अनुमति देता है । उस स्थिति में, आप स्पष्ट रूप से उपयोग नहीं करना चाहेंगे static
, क्योंकि static
ऑब्जेक्ट को रनटाइम पर मौजूद होने के लिए मजबूर करने की संभावना है।
const
किसीconst
ऑब्जेक्ट से दूर नहीं जा सकते हैं , केवल एकconst X*
अंक से a तकX
। लेकिन बात यह नहीं है; मुद्दा यह है कि स्वचालित वस्तुओं में स्थैतिक पते नहीं हो सकते। जैसा कि मैंने कहा,constexpr
संकलन समाप्त होने के बाद सार्थक होना बंद हो जाता है, इसलिए वहाँ से हटकर कुछ भी नहीं है (और संभवतः कुछ भी नहीं है, क्योंकि ऑब्जेक्ट रनटाइम पर मौजूद होने की गारंटी नहीं है।)