परिचय
constexprकार्यान्वयन को यह बताने के लिए एक तरीके के रूप में पेश नहीं किया गया था कि किसी चीज का मूल्यांकन एक संदर्भ में किया जा सकता है जिसके लिए एक स्थिर अभिव्यक्ति की आवश्यकता होती है ; अनुरूपण कार्यान्वयन C ++ 11 से पहले यह साबित करने में सक्षम है।
कुछ कार्यान्वयन जो साबित नहीं कर सकता है वह कोड के एक निश्चित टुकड़े का आशय है:
- ऐसा क्या है जो डेवलपर इस इकाई के साथ व्यक्त करना चाहता है?
- क्या हमें नेत्रहीन रूप से एक निरंतर अभिव्यक्ति में कोड का उपयोग करने की अनुमति देनी चाहिए , क्योंकि यह काम करता है?
बिना दुनिया के क्या होगा constexpr?
मान लें कि आप एक पुस्तकालय विकसित कर रहे हैं और महसूस करते हैं कि आप अंतराल में प्रत्येक पूर्णांक की राशि की गणना करने में सक्षम होना चाहते हैं (0,N]।
int f (int n) {
return n > 0 ? n + f (n-1) : n;
}
इरादे की कमी
एक संकलक आसानी से यह साबित कर सकता है कि अनुवाद के दौरान दिए गए तर्क को ज्ञात होने पर उपरोक्त फ़ंक्शन स्थिर-अभिव्यक्ति में कॉल करने योग्य है ; लेकिन आपने इसे एक इरादे के रूप में घोषित नहीं किया है - यह केवल मामला बन गया है।
अब कोई और साथ आता है, आपके फ़ंक्शन को पढ़ता है, संकलक के समान विश्लेषण करता है; " ओह, यह फ़ंक्शन एक स्थिर-अभिव्यक्ति में प्रयोग करने योग्य है!" , और निम्नलिखित कोड को लिखता है।
T arr[f(10)]; // freakin' magic
अनुकूलन
आप, एक "भयानक" पुस्तकालय डेवलपर के रूप में, तय करते हैं कि fजब आह्वान किया जाए तो परिणाम को कैश करना चाहिए; कौन अधिक से अधिक मूल्यों के एक ही सेट की गणना करना चाहेगा?
int func (int n) {
static std::map<int, int> _cached;
if (_cached.find (n) == _cached.end ())
_cached[n] = n > 0 ? n + func (n-1) : n;
return _cached[n];
}
परिणाम
अपने मूर्खतापूर्ण अनुकूलन को शुरू करके, आपने अपने फ़ंक्शन के हर उपयोग को तोड़ दिया जो कि एक संदर्भ में होता है जहां एक निरंतर अभिव्यक्ति की आवश्यकता होती थी।
आपने कभी वादा नहीं किया कि यह कार्य एक स्थिर-अभिव्यक्ति में प्रयोग करने योग्य था , और इसके बिना constexprइस तरह का वादा करने का कोई तरीका नहीं होगा।
तो, हमें आवश्यकता क्यों है constexpr?
कॉन्स्टैक्स का प्राथमिक उपयोग इरादा घोषित करना है ।
यदि एक इकाई के रूप में चिह्नित नहीं है constexpr- यह एक निरंतर अभिव्यक्ति में इस्तेमाल करने का इरादा नहीं था ; और यहां तक कि अगर यह है, तो हम ऐसे संदर्भ का निदान करने के लिए संकलक पर भरोसा करते हैं (क्योंकि यह हमारे इरादे की उपेक्षा करता है)।
constexpr? यदि हां, तो मैं एक उपयोग देख सकता हूं।