[C++再学习系列] ADL(Koenig)查找
2009-06-25 23:39
344 查看
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
查找
,加快解析过程。
查找
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
查找
,加快解析过程。
相关文章推荐
- C++再学习系列:使用合理的引用参数实现接口的自说明
- [C++再学习系列] Using声明和指令的工作原理
- 总结系列_4(C++知识学习,续...)
- 【面向对象语言系列】关于C++深度学习,你需要知道的事
- DLL学习系列一:c++静态链接库
- C++名称查找与ADL
- C++对象模型学习系列(一)
- [C++再学习系列] 全局或静态变量(对象)的初始化
- 从Delphi转向VC系列学习一:C++基础知识
- [C++再学习系列] 异常安全性
- #数据结构与算法学习笔记#剑指Offer1.5:二维数组中的查找(C++)
- 学习Emacs系列教程(八):查找替换
- [c++]关于template和namespace的关联名字查找ADL
- 【C++】学习笔记草稿版系列1(C到C++类型安全增强)
- C++再学习系列:使用合理的引用参数实现接口的自说明
- [C++再学习系列] 类常量
- 从Delphi转向VC系列学习一:C++基础知识
- 个人学习C++过程中对const的总结:初始化系列之用字面值常量与其他类型的值初始化的区别(一)
- 学习Emacs系列教程(四:Minibuffer)、(五:编辑 -2)、(六:编辑-3) 、(七:剪切板)、(八:查找替换)
- MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式