C++ Koenig查找的基本原理

C++ Koenig查找的基本原理,c++,argument-dependent-lookup,rationale,C++,Argument Dependent Lookup,Rationale,Koenig查找的基本原理是什么 无法避免将其视为使代码更难阅读和更不稳定的东西 难道他们不能定义Koenig查找,使其仅适用于特定情况(即:非成员运算符)或明确要求的情况吗?ADL最强大的用例适用于此类情况 namespace A { struct S {}; S operator+( const S&, const S& ); } namespace B { A::S test() { A::S a, b; r

Koenig查找的基本原理是什么

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


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

ADL最强大的用例适用于此类情况

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

namespace B
{
    A::S test()
    {
        A::S a, b;
        return a + b;
    }
}
它对于在通用代码中选择正确的
交换
函数也很有用,因此它不应仅适用于
运算符
函数。它已经是标准中相当复杂的一部分,制定规则阻止它在某些情况下工作会增加更多的复杂性,这会带来什么好处

我想不出任何明确要求它的简洁方式,这比直接在不同的命名空间中调用函数要简单得多,而且在任何情况下都会使表达式更加复杂


我们的想法是:
return[[use_adl]](a+b)vs.
返回A::operator+(A,b)

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

std::cout << 42;

我从来没有想过。所以连我都想知道。好问题!实际上,我正在考虑在使用koenig查找的函数中添加某种关键字:
void f(const T&a){namespaceof(T)::…;}
。@peroro:
namespaceof(T)
听起来很像是在指定要查找的特定名称空间;在这种情况下,你根本不需要ADL。你最好使用合格的身份证。@Charles Bailey:是的,但我的问题仍然存在。有一个像
namespaceof
这样的操作符代替ADL,并被迫显式使用名称空间,这不是更简单(对于编译器和标准而言)和更干净(对于程序员和标准而言)吗?是的,对于实现者来说更简单;程序员的清洁程序,不,你能想象完全合格吗?<代码> STD::cOUT PeloRo:什么是“简单”时,涉及到C++标准。我认为SFIEAE是在ADL引入后构思出来的。无论如何,我的观点是,我想被迫明确地说要使用什么名称空间(或者明确地说要应用ADL)。。。我在解释我给我的一个朋友写的一段代码,他不讲C++。在我花了十分钟讨论名称空间之后,他问我,在我的代码中,为什么我可以使用另一个名称空间中的函数而不显式地使用它。我听起来很像“哦,是的,因为C++也有其他的规则……”PoRo: C++有很多奇怪的规则,而这将是更糟糕的C++ 0x。然而,我认为最好通过使用
this->
显式调用成员函数并在有意义时使用显式限定来避免ADL。大多数情况下,您不需要它(成员函数调用除外)。有些时候ADL是伟大的。@Alexandre C:是的,我知道这样可以避免,但这并不能回答ADL存在的原因。我想(这是我个人的观点,是的)如果没有它,并被迫避免它,会更简单、更干净。在什么情况下它是伟大的?现在我看到它就像C++中一个奇怪的规则,在一个语法好的语言中,它可以很容易避免。@ PoRo:只要有些人(Stroustrup)认为“以一个东西来左位移位一个流”是很酷的,来打印一个值(而不是说,一个打印函数),而另一些人则认为它有更干净的名字空间,ADL是“最简单”的解决方案。我承认,这是一个肮脏的事情,但是我担心你必须处理它(还有很多其他神秘的C++东西,如果你不知道它们,比如你的错误,比如异常安全,虚拟析构函数,静态对象,重载新的和删除的,悬空的引用,你想要一个完整的列表?)它不仅仅是针对<代码>操作符。