2016-07-10 35 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。 –

相关问题