std::iter_swap需要可值交换参数,而std::swap需要可移动可赋值参数。

4
我不太明白为什么在下面的代码中直接调用std::swap()会导致编译错误,而使用std::iter_swap则可以正常编译。根据iter_swap() versus swap() -- what's the difference?iter_swap最终会调用std::swap,但它们的行为仍然不同。请注意保留原有的HTML标签和格式。
#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()
}

以下是与编程有关的内容,从英语翻译成中文。仅返回翻译后的文本:来源:http://en.cppreference.com/w/cpp/concept/Swappable - sbhal
1个回答

5
iter_swap中调用的swap没有被完全限定,即没有被称为std::swap,而只是swap。因此,在名称查找和ADL期间,编译器会发现多个与调用swap匹配的函数。但是,由于它最匹配,重载分辨率选择了您提供的swap
如果您在主代码中使用swap,则它将能够成功编译,因为它不会找到std::swap。即使您使用using namespace std;,它也将编译。

5
诸如swapbeginsize等内容应称为未限定名称,并通过使用声明将其std::版本引入当前作用域。对这些的限定调用在任何代码审查中都应视为错误。 - Revolver_Ocelot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接