使用 std::swap 禁用 ADL
using std::swap disabled ADL
我认为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
参数无论如何都没有多大意义。
相关文章:
- 嵌入方指针压缩已禁用
- 有没有可能有一个只有ADL才能找到的非好友功能
- clang格式:禁用排序包含
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 如何在C++生成器中禁用"使用调试.dcus"
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何禁用 CPU 的无序执行
- 函数中的 c++ using 语句,后跟函数名称(对于 ADL?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何禁用VTK的热键
- 在C++中禁用宏中的逗号
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 在VS Code中编译C / C ++时如何禁用自动创建EXE文件?
- 如何使用 CLANG 禁用格式安全错误?
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 如何在QSplashScreen中禁用鼠标单击
- 匿名命名空间中类的 ADL
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- 禁用地址共享注册表不起作用
- 使用 std::swap 禁用 ADL