Koenig查找的理由是什么?
无法避免将其视为使您的代码更难以阅读以及更多不稳定的内容。
他们不能定义Koenig查找,以便它只适用于特定情况(即:非成员运营商)或明确要求吗?
答案 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 );
?