संक्षिप्त उत्तर यह है कि न केवल 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संकलन समाप्त होने के बाद सार्थक होना बंद हो जाता है, इसलिए वहाँ से हटकर कुछ भी नहीं है (और संभवतः कुछ भी नहीं है, क्योंकि ऑब्जेक्ट रनटाइम पर मौजूद होने की गारंटी नहीं है।)