ดูเหมือนว่า (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.