我很难理解为什么在下面的代码中直接调用std::swap()
导致编译错误,而使用std::iter_swap
编译没有任何错误。
从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 :(得分:5)
在swap
内调用的iter_swap
不完全限定,即不被称为std::swap
,而是swap
。因此,在名称查找期间,ADL
编译器会找到多个与swap
调用匹配的函数。但是,overload resolution
会选择您提供的swap
,因为它匹配得最好。
如果您在主代码中使用swap
,那么它将编译正常,因为它找不到std::swap
。即使你做using namespace std;