2016-07-10 36 views
2
我有理解爲什麼直接調用化std :: swap()在下面的代碼會導致編譯錯誤,而使用std困難

:: iter_swap編譯沒有任何錯誤。的std :: iter_swap需要ValueSwappable ARGS VS化std :: swap需要移動分配的ARGS

iter_swap() versus swap() -- what's the difference?,iter_swap終於調用std :: swap,但他們的行爲仍然不同。

#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

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

回答

4

swap稱爲內iter_swap完全合格即不稱爲std::swap但正如swap。因此,在名稱查找和ADL編譯器查找與swap的調用相匹配的多個函數。但是,overload resolution選擇您提供的swap,因爲它匹配得最好。

如果您在主代碼中使用swap,那麼它會很好地編譯,因爲它找不到std::swap。它會編譯即使你做using namespace std;

+2

東西,如'swap','begin','size' ...應該被調用不合格,使用'std ::'版本引入使用聲明的當前作用域。對任何代碼審查的合格呼叫都應該被視爲bug。 –

相關問題