ADL与范围分辨率 - 更喜欢哪个?

时间:2012-02-12 05:38:52

标签: c++ argument-dependent-lookup

如何判断是否应该使用

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

而不是

some_namespace::foo(bar);

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

1 个答案:

答案 0 :(得分:1)

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

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

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

此处,f未通过正常查找找到,但是通过参数依赖查找找到它(因为它位于名称空间ns旁边A)。无论如何......

尽可能避免使用ADL。

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