0

我如何判断我是否应该使用

my_type bar;
using some_namespace::foo;
foo(bar);

代替

some_namespace::foo(bar);

调用我的函数时foo(不在我的直接范围内)?是否有一个通用的“规则”来确定是否应该使用 ADL?我应该“默认”使用哪一个?

4

1 回答 1

1

那不是ADL。在您的两个示例中,foo都是通过正常查找找到的。使用 ADL 的示例如下:

namespace ns {
    class A { };
    void f(A) { };
}

int main() {
    f(A());
}

在这里,f不是通过普通查找找到的,而是通过依赖于参数的查找找到的(因为它在命名空间ns旁边A)。任何状况之下...

尽可能避免 ADL。

ADL 在某些特定场景中是有益的,例如对于运算符重载和可交换概念。但是,应该谨慎使用它,因为它在许多其他情况下会导致奇怪的意外行为。

于 2012-02-12T05:43:26.387 回答