/ / std :: iter_swap requiert les arguments ValueSwappable contre std :: swap requiert les arguments Move Assignable - c ++, c ++ 11, swap, move-sémantique

std :: iter_swap requiert les arguments ValueSwappable contre std :: swap nécessite de déplacer les arguments assignables - c ++, c ++ 11, swap, move-sémantique

J'ai du mal à comprendre pourquoi un appel direct à std::swap() dans le code ci-dessous entraîne une erreur de compilation alors que l'utilisation de std::iter_swap compile sans erreur.

De iter_swap() contre swap() -- quelle est la différence?, iter_swap enfin appelle std::swap mais toujours leur comportement est différent.

#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()
}

Réponses:

5 pour la réponse № 1

le swap appelé à l'intérieur iter_swap est ne pas pleinement qualifié, c'est-à-dire non appelé std::swap mais juste comme swap. Par conséquent, pendant la recherche de nom et ADL Le compilateur trouve plusieurs fonctions qui correspondent à l'appel de swap. Mais le overload resolution sélectionne le swap fourni par vous, car il correspond le mieux.

Si tu utilises swap dans votre code principal, alors il compilerait bien car il ne trouverait pas std::swap. Il va compiler même si tu le fais using namespace std;