std :: iter_swap需要ValueSwappable args vs std :: swap需要Move Assignable args

时间:2016-07-10 11:43:02

标签: c++ c++11 swap move-semantics

我很难理解为什么在下面的代码中直接调用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()
}

1 个答案:

答案 0 :(得分:5)

swap内调用的iter_swap 完全限定,即不被称为std::swap,而是swap。因此,在名称查找期间,ADL编译器会找到多个与swap调用匹配的函数。但是,overload resolution会选择您提供的swap,因为它匹配得最好。

如果您在主代码中使用swap,那么它将编译正常,因为它找不到std::swap。即使你做using namespace std;

,它也会编译