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 swap
için izin verilen tek yol , çünkü ad alanına bildirim eklemek std
genellikle tanımlanmamış bir davranış. Std ad alanını genişletme (cppreference.com) :
Aşağıda belirtilen birkaç istisna dışında, ad alanına std
veya içinde yer alan herhangi bir ad alanına bildirim veya tanım eklemek tanımsız bir davranıştır.std
Ve swap
bu istisnalardan biri olarak gösterilmez. Dolayısıyla ad alanına kendi swap
aşırı yüklemenizi eklemek std
tanı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ı swap
tanımlı çağrı yapmak için işleve niteliksiz bir çağrı kullandığı da söylenir .swap
swap
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 swap
iç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::swap
kullanıcı tanımlı bir sınıf için işlevi doğrudan kullanmanın, kullanıcı tanımlı std::swap
yerine 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, swap
kullanı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.