我如何判断我是否应该使用
my_type bar;
using some_namespace::foo;
foo(bar);
代替
some_namespace::foo(bar);
调用我的函数时foo
(不在我的直接范围内)?是否有一个通用的“规则”来确定是否应该使用 ADL?我应该“默认”使用哪一个?
我如何判断我是否应该使用
my_type bar;
using some_namespace::foo;
foo(bar);
代替
some_namespace::foo(bar);
调用我的函数时foo
(不在我的直接范围内)?是否有一个通用的“规则”来确定是否应该使用 ADL?我应该“默认”使用哪一个?
那不是ADL。在您的两个示例中,foo
都是通过正常查找找到的。使用 ADL 的示例如下:
namespace ns {
class A { };
void f(A) { };
}
int main() {
f(A());
}
在这里,f
不是通过普通查找找到的,而是通过依赖于参数的查找找到的(因为它在命名空间ns
旁边A
)。任何状况之下...
尽可能避免 ADL。
ADL 在某些特定场景中是有益的,例如对于运算符重载和可交换概念。但是,应该谨慎使用它,因为它在许多其他情况下会导致奇怪的意外行为。