एक समारोह के रूप में चिह्नित करना constexpr
भी इसे एक इनलाइन फ़ंक्शन बनाता है also [dcl.constexpr] / 1
एक फ़ंक्शन या स्थैतिक डेटा सदस्य को कॉन्स्ट्रेक्स स्पेसियर के साथ घोषित किया गया है, जो कि एक इनलाइन फ़ंक्शन या चर (7.1.6) है।
inline
बदले में, इसका मतलब है कि आपको हर अनुवाद इकाई में उस फ़ंक्शन की परिभाषा को शामिल करना होगा जिसमें इसका उपयोग किया जा सकता है। वह मूल रूप से मतलब हैconstexpr
कार्य या तो होने चाहिए:
- एक अनुवाद इकाई में उपयोग करने के लिए प्रतिबंधित है, या
- एक हेडर में परिभाषित किया गया।
अधिकांश विशिष्ट फ़ंक्शंस जिन्हें आप हेडर में घोषित करना चाहते हैं और एक स्रोत फ़ाइल में परिभाषित करते हैं (और कुछ भी जो उनका उपयोग करता है उनमें हेडर शामिल है, फिर उस स्रोत की ऑब्जेक्ट फ़ाइल के खिलाफ लिंक) constexpr
बस काम नहीं करेगा।
सिद्धांत रूप में, मुझे लगता है कि आप सब कुछ हेडर में स्थानांतरित कर सकते हैं और केवल एक स्रोत फ़ाइल है जिसमें सिर्फ सभी हेडर शामिल हैं, लेकिन यह बहुत बार संकलन को नुकसान पहुंचाएगा, और अधिकांश गंभीर परियोजनाओं के लिए संकलन करने के लिए बहुत अधिक मात्रा में मेमोरी की आवश्यकता होगी।
एक constexpr
फ़ंक्शन भी कुछ मायनों में प्रतिबंधित है, इसलिए कुछ कार्यों के लिए यह एक विकल्प नहीं हो सकता है। प्रतिबंधों में शामिल हैं:
- आभासी कार्य नहीं हो सकते
constexpr
।
- इसका वापसी प्रकार एक 'शाब्दिक प्रकार' होना चाहिए (उदाहरण के लिए, गैर-ट्रिटिंग सीज़र या डस्टर के साथ कोई ऑब्जेक्ट नहीं)।
- इसके सभी पैरामीटर शाब्दिक प्रकार के होने चाहिए।
- फ़ंक्शन बॉडी में एक
try
ब्लॉक नहीं हो सकता ।
- इसमें एक गैर-शाब्दिक प्रकार की एक वैरिएबल परिभाषा या स्थिर या थ्रेड स्टोरेज अवधि के साथ कुछ भी नहीं हो सकता है।
मैंने कुछ चीजों को अस्पष्ट कर दिया है (उदाहरण के लिए, यह भी एक goto
या एक asm
बयान नहीं हो सकता है ), लेकिन आपको यह विचार मिलता है - काफी कुछ चीजों के लिए, यह सिर्फ काम नहीं करेगा।
निचला रेखा: हाँ, ऐसी बहुत सी स्थितियाँ हैं जहाँ यह एक बुरा विचार होगा।