Tampaknya (2) ( berdiri bebas swap
di namespace yang sama di mana kelas yang ditentukan pengguna dideklarasikan ) adalah satu-satunya cara yang diizinkan untuk menyediakan swap
kelas yang ditentukan pengguna, karena menambahkan deklarasi ke namespace std
umumnya merupakan perilaku yang tidak ditentukan. Memperluas namespace std (cppreference.com) :
Ini adalah perilaku yang tidak ditentukan untuk menambahkan deklarasi atau definisi ke namespace std
atau ke namespace yang bersarang di dalamnya std
, dengan beberapa pengecualian yang disebutkan di bawah ini
Dan swap
tidak dilambangkan sebagai salah satu pengecualian itu. Jadi menambahkan swap
kelebihan Anda sendiri ke std
namespace adalah perilaku yang tidak ditentukan.
Juga dikatakan bahwa pustaka standar menggunakan panggilan yang tidak memenuhi syarat ke swap
fungsi untuk memanggil yang ditentukan swap
pengguna untuk kelas pengguna jika ditentukan pengguna swap
tersebut 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 swap
dengan cara yang tidak memenuhi syarat untuk memungkinkan pemanggilan overload kustom untuk tipe non-fundamental daripada versi generik ini: Overload kustom swap
dideklarasikan 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::swap
fungsi untuk kelas yang ditentukan pengguna akan memanggil versi generik, std::swap
bukan yang ditentukan pengguna swap
:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
Jadi direkomendasikan untuk memanggil swap
fungsi 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.