सामान्य तौर पर यह एक फ़ंक्शन को अनुपयोगी बनाने के लिए संदर्भित करता है, उदाहरण के लिए यदि आप किसी प्रोग्राम में डायनेमिक आवंटन के उपयोग पर प्रतिबंध लगाना चाहते हैं, तो आप malloc
फ़ंक्शन को "जहर" कर सकते हैं, इसलिए इसका उपयोग नहीं किया जा सकता है।
वीडियो में वह इसे और अधिक विशिष्ट तरीके से उपयोग कर रहा है, जो स्पष्ट है यदि आप उस स्लाइड को पढ़ते हैं जो प्रदर्शित होने पर वह फ़ंक्शन को जहर देने की बात करता है, जो कहता है "केवल संकलन-समय को मजबूर करने का एक तरीका?"
इसलिए वह रन-टाइम में इसे अचूक बनाने के लिए फंक्शन को "पॉइजनिंग" करने की बात कर रहे हैं, इसलिए यह निरंतर अभिव्यक्तियों में केवल कॉल करने योग्य है। तकनीक को फंक्शन में एक ब्रांच लगानी होती है, जिसे कभी भी कंपाइल-टाइम के संदर्भ में नहीं लिया जाता है, और उस ब्रांच को बनाने के लिए कुछ ऐसा होता है, जिससे कोई त्रुटि होगी।
एक throw
कॉन्स्ट्रेक्स फ़ंक्शन में एक अभिव्यक्ति की अनुमति है, जब तक कि यह फ़ंक्शन के संकलन-समय आह्वान के दौरान कभी नहीं पहुंचता है (क्योंकि आप संकलन-समय पर अपवाद नहीं फेंक सकते हैं, यह एक अंतर्निहित गतिशील ऑपरेशन है, जैसे मेमोरी आवंटित करना)। तो एक फेंक अभिव्यक्ति जो एक अपरिभाषित प्रतीक को संदर्भित करता है, संकलन-समय के इनवोकेशन के दौरान उपयोग नहीं किया जाएगा (क्योंकि यह संकलन करने में विफल होगा) और रन-टाइम पर उपयोग नहीं किया जा सकता है, क्योंकि अपरिभाषित प्रतीक एक लिंकर त्रुटि का कारण बनता है।
क्योंकि अपरिभाषित प्रतीक फ़ंक्शन के संकलन-समय के इनवोकेशन में "odr-used" नहीं है, व्यवहार में संकलक प्रतीक का संदर्भ नहीं बनाएगा, इसलिए यह ठीक है कि यह अपरिभाषित है।
क्या यह उपयोगी है? वह दिखा रहा है कि यह कैसे करना है, जरूरी नहीं कि यह एक अच्छा विचार है या व्यापक रूप से उपयोगी है। यदि आपको किसी कारण से ऐसा करने की आवश्यकता है तो उसकी तकनीक आपकी समस्या का समाधान कर सकती है। यदि आपको इसकी आवश्यकता नहीं है, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।
एक कारण यह उपयोगी हो सकता है जब कुछ ऑपरेशन का संकलन-समय संस्करण उतना कुशल नहीं है जितना यह हो सकता है। एक कॉन्स्ट्रेक्स फ़ंक्शन (विशेष रूप से C ++ 11 में, C ++ 14 में कुछ प्रतिबंध हटा दिए गए थे) पर इस तरह के अभिव्यक्ति की अनुमति है। तो आपके पास गणना करने के लिए एक फ़ंक्शन के दो संस्करण हो सकते हैं, एक जो कि इष्टतम है, लेकिन उन अभिव्यक्तियों का उपयोग करता है जिन्हें एक कॉन्स्ट्रेक्स फ़ंक्शन में अनुमति नहीं है, और एक जो एक वैध कॉन्स्ट्रेक्स फ़ंक्शन है, लेकिन रन-टू में कॉल किए जाने पर खराब प्रदर्शन करेगा समय। आप यह सुनिश्चित करने के लिए उप-इष्टतम एक को जहर कर सकते हैं कि इसे रन-टाइम कॉल के लिए कभी उपयोग नहीं किया जाता है, रन-टाइम कॉल के लिए अधिक कुशल (गैर-कॉन्स्ट्रेक्स) संस्करण का उपयोग किया जाता है।
NB संकलन-समय पर उपयोग किए जाने वाले एक कॉन्स्ट्रेक्स फ़ंक्शन का प्रदर्शन वास्तव में महत्वपूर्ण नहीं है, क्योंकि इसके पास कोई रन-टाइम ओवरहेड नहीं है। यह कंपाइलर को अतिरिक्त काम करके आपके संकलन को धीमा कर सकता है, लेकिन इसमें कोई रन-टाइम प्रदर्शन लागत नहीं होगी।