2016-07-10 25 views
2

Ich habe Schwierigkeiten zu verstehen, warum direkter Aufruf von std :: swap() in unter Code einen Kompilierungsfehler ergibt, während die Verwendung von std :: iter_swap kompiliert ohne irgendein Fehler.std :: iter_swap erfordert ValueSwappable args vs std :: swap erfordert Move Assignable args

Von iter_swap() versus swap() -- what's the difference?, ruft Iter_swap schließlich std :: swap, aber immer noch ihr Verhalten ist anders.

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

Quelle: http://en.cppreference.com/w/cpp/concept/Swappable – sbhal

Antwort

4

Die swap innerhalb iter_swap genannt ist nicht voll qualifiziert d.h nicht als std::swap aber ebenso swap genannt. Daher findet der Compiler während der Namenssuche und ADL mehrere Funktionen, die mit dem Aufruf an swap übereinstimmen. Aber die overload resolution wählt die swap von Ihnen zur Verfügung gestellt, da es am besten übereinstimmt.

Wenn Sie swap in Ihrem Hauptcode verwenden, würde es gut kompilieren, wie es std::swap nicht finden würde. Es wird kompilieren, auch wenn Sie using namespace std;

+2

Dinge wie 'Swap',' beginnen ',' Größe' ... sollte aufgerufen werden unqualifiziert, wobei die 'std ::' Version den aktuellen Gültigkeitsbereich mit using-declaration enthält. Qualifizierter Aufruf an diese sollte als Bug bei jeder Code-Überprüfung behandelt werden. –