使用std :: swap禁用ADL

时间:2019-12-09 02:00:18

标签: c++ swap argument-dependent-lookup

我认为public void () { //calculations System.out.println("formatted response"); } 的要点是,如果我们交换某个类,交换将搜索该类所定义的名称空间,否则它将使用std :: swap.so,因此我编写了一些代码对其进行测试。

using std::swap

但是结果使我感到困惑。它直接使用std :: swap,有人可以解释原因吗?

更新

如果函数寻找更好的匹配,为什么下面的代码输出“ inside”,看起来像使用声明隐藏了全局foo,这是更好的匹配

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);
}

1 个答案:

答案 0 :(得分:3)

在重载解析中,您的swap将与std::swap相对,因为std::swap将参数作为非const的引用,而函数将其视为{{ 1}}引用,使匹配变得更糟。

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

实际上,使用const参数的swap函数反正没有多大意义。