Tampaknya (2) ( berdiri bebas swapdi namespace yang sama di mana kelas yang ditentukan pengguna dideklarasikan ) adalah satu-satunya cara yang diizinkan untuk menyediakan swapkelas yang ditentukan pengguna, karena menambahkan deklarasi ke namespace stdumumnya merupakan perilaku yang tidak ditentukan. Memperluas namespace std (cppreference.com) :
Ini adalah perilaku yang tidak ditentukan untuk menambahkan deklarasi atau definisi ke namespace stdatau ke namespace yang bersarang di dalamnya std, dengan beberapa pengecualian yang disebutkan di bawah ini
Dan swaptidak dilambangkan sebagai salah satu pengecualian itu. Jadi menambahkan swapkelebihan Anda sendiri ke stdnamespace adalah perilaku yang tidak ditentukan.
Juga dikatakan bahwa pustaka standar menggunakan panggilan yang tidak memenuhi syarat ke swapfungsi untuk memanggil yang ditentukan swappengguna untuk kelas pengguna jika ditentukan pengguna swaptersebut disediakan.
Dapat ditukar (cppreference.com) :
Banyak fungsi pustaka standar (misalnya, banyak algoritme) mengharapkan argumennya memenuhi Swappable , yang berarti bahwa setiap kali pustaka standar melakukan swap, ia menggunakan padanannya using std::swap; swap(t, u);.
swap (www.cplusplus.com) :
Banyak komponen pustaka standar (di dalam std) memanggil swapdengan cara yang tidak memenuhi syarat untuk memungkinkan pemanggilan overload kustom untuk tipe non-fundamental daripada versi generik ini: Overload kustom swapdideklarasikan di namespace yang sama dengan jenis yang mereka sediakan dipilih melalui pencarian yang bergantung pada argumen atas versi umum ini.
Namun perhatikan bahwa secara langsung menggunakan std::swapfungsi untuk kelas yang ditentukan pengguna akan memanggil versi generik, std::swapbukan yang ditentukan pengguna swap:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
Jadi direkomendasikan untuk memanggil swapfungsi dalam kode pengguna dengan cara yang sama seperti yang dilakukan di pustaka standar:
my::object a, b;
using std::swap;
swap(a, b); // calls my::swap if it is defined, or std::swap if it is not.