"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > `std::function` में समानता की तुलना क्यों नहीं है?

`std::function` में समानता की तुलना क्यों नहीं है?

2024-11-02 को प्रकाशित
ब्राउज़ करें:387

Why Does `std::function` Lack Equality Comparison?

std::function की समानता तुलनीयता पहेली को सुलझाना

पहेली:

std::function क्यों है, आधुनिक सी कोडबेस का एक अभिन्न घटक, समानता तुलना क्षमताओं से संपन्न नहीं है? इस प्रश्न ने शुरुआत से ही प्रोग्रामर्स को उलझन में डाल दिया है, जिससे कॉल करने योग्य वस्तुओं के संग्रह को प्रबंधित करने में भ्रम और कठिनाइयाँ पैदा हो रही हैं। 11 मानक, ऑपरेटर== और ऑपरेटर!= के लिए ओवरलोड घोषित किए गए लेकिन हटा दिए गए, जिससे एक शून्य पैदा हो गया जिसे कभी भी पर्याप्त रूप से समझाया नहीं गया। संलग्न टिप्पणी "टाइप सिस्टम में संभावित छेद को बंद करें" एक छिपी हुई खामी की ओर इशारा करती है, लेकिन इसकी प्रकृति एक रहस्य बनी हुई है।

बचाव का रास्ता और सुरक्षा उपाय:

संदिग्ध "खामी का रास्ता" एक बूलियन रूपांतरण फ़ंक्शन की उपस्थिति से उत्पन्न होता है। स्पष्ट समानता तुलना ऑपरेटरों की अनुपस्थिति में, यह फ़ंक्शन == या != के माध्यम से अंतर्निहित तुलना की अनुमति दे सकता है। हालाँकि, यह खामी अप्रत्याशित व्यवहार का कारण बन सकती है, जैसा कि प्रदर्शित किया गया है:

struct S { ऑपरेटर बूल() { झूठी वापसी; } }; मुख्य प्रवेश बिंदु() { एस ए, बी; बूल हैं_बराबर(ए == बी); // ए और बी पर ऑपरेटर बूल का उपयोग करता है! }

सी 03 ने सुरक्षित-बूल मुहावरा पेश किया और सी 11 ने इस खामी को रोकने के लिए एक स्पष्ट बूल रूपांतरण फ़ंक्शन लागू किया।

struct S {
    operator bool() { return false; }
};

int main() {
    S a, b;
    bool are_equal(a == b); // Uses operator bool on a and b!
}

std::function के विपरीत, std::shared_ptr में अच्छी तरह से परिभाषित समानता शब्दार्थ है। दो संकेतक बराबर हैं यदि वे दोनों खाली हैं या यदि वे दोनों गैर-रिक्त हैं और एक ही वस्तु की ओर इशारा करते हैं। इस स्पष्ट परिभाषा ने std::shared_ptr में समानता तुलना ऑपरेटरों के कार्यान्वयन की अनुमति दी।

पहेली सुलझी:

std::function समानता को तुलनीय न बनाने का औचित्य मनमाने ढंग से कॉल करने योग्य प्रकारों के लिए एक सार्थक समानता मानदंड को परिभाषित करने की अंतर्निहित चुनौती से उत्पन्न होता है। यदि इसे लागू किया जाता है, तो यह सभी फ़ंक्शन ऑब्जेक्ट कार्यान्वयनकर्ताओं पर बोझ डाल देगा, और बाध्यकारी तर्कों में अंतर के कारण यह अभी भी अस्पष्ट तुलनाओं को जन्म दे सकता है। इसके अलावा, समानता ऑपरेटरों की अनुपस्थिति प्रभावी रूप से अंतर्निहित रूपांतरणों से उत्पन्न होने वाली खामियों को बंद कर देती है।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3