ऐसा लगता है कि (2) ( उसी नामस्थान में मुक्त होना swap
जहां उपयोगकर्ता परिभाषित वर्ग घोषित है ) उपयोगकर्ता-परिभाषित वर्ग के लिए प्रदान करने का एकमात्र अनुमत तरीका है swap
, क्योंकि नामस्थान std
में घोषणाओं को जोड़ना आम तौर पर एक अपरिभाषित व्यवहार है। नाम स्थान std (cppreference.com) का विस्तार :
नीचे उल्लिखित कुछ अपवादों के साथ नामस्थान std
या किसी भी नामस्थान में घोषित या परिभाषाओं को जोड़ने के लिए अपरिभाषित व्यवहार हैstd
और swap
उन अपवादों में से एक के रूप में निरूपित नहीं किया जाता है। तो अपने स्वयं के swap
अधिभार को std
नेमस्पेस में जोड़ना एक अपरिभाषित व्यवहार है।
यह भी कहा जाता है कि मानक पुस्तकालय swap
फ़ंक्शन के लिए एक अयोग्य कॉल का उपयोग करता है ताकि swap
उपयोगकर्ता वर्ग के लिए उपयोगकर्ता-परिभाषित कॉल किया जा सके यदि ऐसा उपयोगकर्ता-परिभाषित swap
प्रदान किया गया हो।
स्वैपेबल (cppreference.com) :
कई मानक लाइब्रेरी फ़ंक्शंस (उदाहरण के लिए, कई एल्गोरिदम) स्वैपेबल को संतुष्ट करने के लिए उनके तर्क की अपेक्षा करते हैं , जिसका अर्थ है कि किसी भी समय मानक लाइब्रेरी एक स्वैप करता है, इसके बराबर का उपयोग करता है using std::swap; swap(t, u);
।
स्वैप (www.cplusplus.com) :
मानक लाइब्रेरी के कई घटक (भीतर std
) गैर-मौलिक प्रकारों के लिए कस्टम अधिभार की अनुमति देने के लिए swap
एक अयोग्य तरीके से कॉल करते हैं जो इस सामान्य संस्करण के बजाय कहे जाते हैं: कस्टम ओवरलोड swap
को उसी नामस्थान में घोषित किया जाता है जिस प्रकार के लिए उन्हें चुना जाता है। इस सामान्य संस्करण पर तर्क-निर्भर लुकअप के माध्यम से ।
लेकिन ध्यान दें कि std::swap
उपयोगकर्ता-परिभाषित वर्ग के लिए सीधे फ़ंक्शन का उपयोग करना उपयोगकर्ता-परिभाषित के std::swap
बजाय सामान्य संस्करण को कॉल करता है swap
:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
तो यह swap
फ़ंक्शन को उसी तरह से उपयोगकर्ता कोड में कॉल करने की सिफारिश की जाती है, जैसा कि मानक पुस्तकालय में किया जाता है:
my::object a, b;
using std::swap;
swap(a, b); // calls my::swap if it is defined, or std::swap if it is not.