Koenig查找的基本原理

时间:2011-01-05 09:35:47

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

Koenig查找的理由是什么?

无法避免将其视为使您的代码更难以阅读以及更多不稳定的内容。

他们不能定义Koenig查找,以便它只适用于特定情况(即:非成员运营商)或明确要求吗?

2 个答案:

答案 0 :(得分:5)

最初的动机,IIRC,是能够写的

std::cout << 42;

无需明确限定std::operator<<(std::ostream&, int)

如果要禁用参数相关查找,则可以明确限定函数名称,即。使用std::swap而不是swap来阻止swap在其参数所在的任何命名空间中被查找。

ADL也可以与SFINAE一起用于在编译时测试是否为某个特定类型定义了某个函数(我将让你将其作为练习来解决,在Stackoverflow上至少有一个关于此的问题)。 / p>

答案 1 :(得分:3)

ADL的最强用例是针对这种情况。

namespace A
{
    struct S {};
    S operator+( const S&, const S& );
}

namespace B
{
    A::S test()
    {
        A::S a, b;
        return a + b;
    }
}

在通用代码中选择正确的swap函数也很有用,因此它不仅适用于operator函数。它已经是标准中相当复杂的一部分,使得在某些情况下无法工作的规则会增加复杂性,会有什么收获?

我无法想到任何明确要求明确的方式,比直接在不同的命名空间中调用函数要简单得多,并且无论如何都会使表达式更复杂。

我们想的是:return [[ use_adl ]] (a + b);return A::operator+( a, b );