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