ऐसा लगता है कि (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.