8

Koenig 查找的基本原理是什么?

无法避免将其视为使您的代码更难阅读且更不稳定的东西。

难道他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确需要时?

4

2 回答 2

5

IIRC 最初的动机是能够写作

std::cout << 42;

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

如果要禁用依赖于参数的查找,可以明确限定函数名称,即。使用std::swap而不是swap防止swap在其参数将存在的任何名称空间中查找。

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

于 2011-01-05T09:51:10.673 回答
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);vs return A::operator+( a, b );. ?

于 2011-01-05T09:49:39.847 回答