gpt4 book ai didi

c++ - std::iter_swap 需要 ValueSwappable args vs std::swap 需要 Move Assignable args

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:51 29 4
gpt4 key购买 nike

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

最佳答案

iter_swap 中调用的 swap完全合格的,即不作为 std::swap 调用,而只是作为 交换。因此,在名称查找和 ADL 期间,编译器会找到多个与 swap 调用相匹配的函数。但是,重载解决方案 会选择您提供的交换,因为它最匹配。

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

也会编译

关于c++ - std::iter_swap 需要 ValueSwappable args vs std::swap 需要 Move Assignable args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291489/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com