C 17 का "if constexpr" टेम्पलेट फ़ंक्शंस तक सीमित है
C 17 में, "if constexpr" की शुरूआत ने इसके प्रति रुचि जगाई है संकलन-समय स्थिरांक के आधार पर कोड को सशर्त रूप से निष्पादित करने की क्षमता। हालाँकि, गैर-टेम्प्लेटेड फ़ंक्शंस में इसका उपयोग करने का प्रयास करते समय एक समस्या उत्पन्न होती है।
निम्नलिखित कोड पर विचार करें:
#include
#include
void print(auto value)
{
// Compile-time check if value is a pointer
if constexpr (std::is_pointer_v)
std::cout हालाँकि यह कोड टेम्प्लेट किए गए फ़ंक्शंस में त्रुटियों के बिना संकलित होता है, लेकिन प्रिंट जैसे गैर-टेम्प्लेटेड फ़ंक्शन में रखे जाने पर यह संकलन त्रुटि के साथ विफल हो जाता है। इसका कारण "if constexpr" के व्यवहार में निहित है।
"if constexpr" को टेम्पलेट कोड के सशर्त संकलन की अनुमति देने के लिए डिज़ाइन किया गया है। एक टेम्प्लेट फ़ंक्शन में, कंपाइलर कंपाइल समय पर पैरामीटर के प्रकार का अनुमान लगाता है, जिससे प्रकार के आधार पर उचित कोड पथ का चयन सक्षम हो जाता है। इस मामले में, जब प्रिंट फ़ंक्शन को टेम्प्लेट किया जाता है, तो यह पहचान सकता है कि संकलन समय पर मान एक सूचक है या नहीं और संबंधित कोड शाखा को निष्पादित करता है।
हालांकि, एक गैर-टेम्प्लेटेड फ़ंक्शन में, मान का प्रकार ज्ञात होता है केवल रनटाइम पर, "if constexpr" को अप्रभावी बना देता है। कंपाइलर कंडीशनल की दोनों शाखाओं को निष्पादन योग्य कोड के रूप में मानता है, जिससे जब मान एक पूर्णांक होता है तो पीटीआर में शाखा में मूल्य को डीरेफरेंस करने का प्रयास करते समय संकलन त्रुटि होती है।
इस समस्या से बचने के लिए, " रखना आवश्यक है यदि constexpr" एक टेम्प्लेट फ़ंक्शन के भीतर है या संकलन-समय प्रकार कटौती सुनिश्चित करने के लिए गैर-टेम्प्लेटेड फ़ंक्शन को स्पष्ट प्रकार की जानकारी प्रदान करता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3