Görünüşe göre (2) ( kullanıcı tanımlı sınıfın bildirildiği aynı ad alanında serbest durmaswap ) , kullanıcı tanımlı bir sınıf sağlamak swapiçin izin verilen tek yol , çünkü ad alanına bildirim eklemek stdgenellikle tanımlanmamış bir davranış. Std ad alanını genişletme (cppreference.com) :
Aşağıda belirtilen birkaç istisna dışında, ad alanına stdveya içinde yer alan herhangi bir ad alanına bildirim veya tanım eklemek tanımsız bir davranıştır.std
Ve swapbu istisnalardan biri olarak gösterilmez. Dolayısıyla ad alanına kendi swapaşırı yüklemenizi eklemek stdtanımsız bir davranıştır.
Ayrıca, standart kitaplığın, eğer böyle bir kullanıcı tanımlı sağlanmışsa bir kullanıcı sınıfı için kullanıcı swaptanımlı çağrı yapmak için işleve niteliksiz bir çağrı kullandığı da söylenir .swapswap
Değiştirilebilir (cppreference.com) :
Birçok standart kütüphane işlevi (örneğin, birçok algoritma) argümanlarının Swappable'ı tatmin etmesini bekler , yani standart kütüphane bir takas yaptığında, eşdeğerini kullanır using std::swap; swap(t, u);.
takas (www.cplusplus.com) :
Standart kitaplığın (iç std) birçok bileşeni, temel olmayan türler için özel aşırı yüklemelerin bu genel sürüm yerine çağrılmasına izin vermek swapiçin niteliksiz bir şekilde çağırır : Sağlandıkları türleswap aynı ad alanında bildirilen özel aşırı yükler seçilir bu genel sürüm üzerinden bağımsız değişkene bağlı arama yoluyla .
Ancak, std::swapkullanıcı tanımlı bir sınıf için işlevi doğrudan kullanmanın, kullanıcı tanımlı std::swapyerine genel sürümü çağırdığını unutmayın swap:
my::object a, b;
std::swap(a, b); // calls std::swap, not my::swap
Bu nedenle, swapkullanıcı kodundaki işlevi, standart kitaplıkta olduğu gibi çağırmanız önerilir :
my::object a, b;
using std::swap;
swap(a, b); // calls my::swap if it is defined, or std::swap if it is not.