使用 std::swap 禁用 ADL

using std::swap disabled ADL

本文关键字:ADL 禁用 swap 使用 std      更新时间:2023-10-16

我认为using std::swap的重点是如果我们交换某个类,交换将搜索定义该类的命名空间,否则它使用 std::swap.所以我写了一些代码来测试它。

namespace np{
class myclass{
...
};
void swap(const myclass&lhs,const myclass&rhs){
cout<<"np::swap()"<<endl;
}
}

int main()
{
np::myclass m1,m2;
using std::swap;
swap(m1,m2);
}

但是结果混淆了 me.it 直接使用std::swap,有人可以解释为什么吗?谢谢。

更新

如果函数寻找更好的匹配,为什么下面的代码输出"inside",看起来用声明隐藏了全局foo,哪个比较匹配

namespace np{
class myclass{
//...
};
void  foo(const myclass&m){
cout<<"inside";
}
}
void foo(np::myclass &m){
cout<<"global";
}
int main()
{
np::myclass m;
using np::foo;
foo(m);
} 

在重载分辨率中,您的swap将针对std::swap解析而松动,因为std::swap将参数作为非const引用,而您的函数将它们作为const引用,使其成为更差的匹配。

只需删除参数中的const,您的 ADL 重载将是首选。

实际上,swap函数接受const参数无论如何都没有多大意义。