[C++再学习系列] ADL(Koenig)查找

本文介绍了ADL(Koenig查找)的概念及其在C++中的应用。ADL是一种用于无限定域函数调用的名字查找规则,它能确保使用类型X的对象x时,可以像使用X的成员函数一样简单地使用非成员函数。文章通过示例展示了如何根据ADL规则在不同的名字空间中查找函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ADL(Koenig) 查找

ADL ,参数相关查找,也称作为 Koenig 查找(以 Andrew Koenig 的名字命名),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。

首先来看一个函数所在的域的分类:

1 :类域(函数作为某个类的成员函数(静态或非静态))

2 :名字空间域

3 :全局域

Koenig 查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间 加入查找的范围。

ADL 就是为了确保使用类型 X 的对象 x 时能够像使用 X 的成员函数一样简单 (ensure that code that uses an object x of type X can use its nonmember function interface as easily as it can use member functions)

根据 ADL 规则,如果非成员函数想和类型一起被使用,应该将它们置于同一个名字空间中。换句话说,和类型 X 放在同一名字空间下的非成员函数,也是 X 接口的一部分。 ( 常见的有 <<or>> 操作符 )

示例:

#include <iostream>

//class N     // 类域

//{

//public :

//     enum E {e1};

//     void f(E)

//     {

//            std::cout << "N::f(N::E) called/n";

//     }

//};

namespace N{   // 名字空间域

       enum E {e1};

       void f(E){

              std::cout << "N::f(N::E) called/n";

       }

}

void f(int)

{

       std::cout << " ::f(int) called/n";

}

 

int main()

{

       ::f(N::e1);     // 受限函数,禁用 ADL  // 输出 ::f(int) called

       f(N::e1);      // 普通查找到 f();

       return 0;

}

 

上述例子,如果 N class ,输出为: ::f(int) called ;如果 N 为名字空间,输出: N::f(N::E) called

也就是说 ADL 仅会将参数所在的名字空间中的函数名字加入查找范围。

调用函数时,显式地限定名字空间将禁用 ADL 查找 ,加快解析过程。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值