Koenig 查找的基本原理是什么?
无法避免将其视为使您的代码更难阅读且更不稳定的东西。
难道他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确需要时?
Koenig 查找的基本原理是什么?
无法避免将其视为使您的代码更难阅读且更不稳定的东西。
难道他们不能定义 Koenig 查找,使其仅适用于特定情况(即:非成员运算符)或明确需要时?
IIRC 最初的动机是能够写作
std::cout << 42;
无需std::operator<<(std::ostream&, int)
明确限定。
如果要禁用依赖于参数的查找,可以明确限定函数名称,即。使用std::swap
而不是swap
防止swap
在其参数将存在的任何名称空间中查找。
ADL 也可以与 SFINAE 一起使用,在编译时测试是否为特定类型定义了某些函数(我会让您将其作为练习来解决,在 Stackoverflow 上至少有一个关于此的问题)。
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 );
. ?