Mam trudności ze zrozumieniem, dlaczego jest to bezpośrednie połączenie std::swap()
w poniższym kodzie pojawia się błąd kompilacji podczas używania std::iter_swap
kompiluje bez żadnego błędu.
Od iter_swap()
w porównaniu swap()
-- co za różnica?, iter_swap
w końcu dzwoni std::swap
ale nadal ich zachowanie jest inne.
#include <iostream>
#include <vector>
class IntVector {
std::vector<int> v;
IntVector& operator=(IntVector); // not assignable
public:
void swap(IntVector& other) {
v.swap(other.v);
}
};
void swap(IntVector& v1, IntVector& v2) {
v1.swap(v2);
}
int main()
{
IntVector v1, v2;
// std::swap(v1, v2); // compiler error! std::swap requires MoveAssignable
std::iter_swap(&v1, &v2); // OK: library calls unqualified swap()
}
Odpowiedzi:
5 dla odpowiedzi № 1The swap
w środku iter_swap
jest nie w pełni kwalifikowany, tj. nie nazywany jako std::swap
ale tak jak swap
. Dlatego podczas wyszukiwania nazwy i ADL
kompilator znajduje wiele funkcji, które pasują do wywołania swap
. Ale overload resolution
wybiera swap
dostarczone przez ciebie, ponieważ pasuje najlepiej.
Jeśli użyjesz swap
w twoim głównym kodzie, to skompilowałoby się dobrze, ponieważ nie znalazłoby std::swap
. Skompiluje się, nawet jeśli to zrobisz using namespace std;