/ / std :: iter_swap wymaga Valueswappable args vs std :: swap wymaga Move Assignable args - c ++, c ++ 11, swap, move-semantics

std :: iter_swap wymaga Valueswappable args vs std :: swap wymaga Move Assignable args - c ++, c ++ 11, swap, move-semantics

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 № 1

The 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;