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