您的位置:首页 > 编程语言 > C语言/C++

C++ 的名字查找(name lookup)

2016-01-01 17:58 387 查看
C++名字查找有两个方法:

一个是OL(ordinary name lookup) 普通查找规则

一个是ADL(argument-depentment lookup)依赖于实参的名字查找(也称KL法)

Ordinal Lookup顺序查找,所谓顺序查找,就是从函数调用所处的域开始(如果函数调用处于一个成员函数中,初始域就是类域,如果处于自由函数中,初始域就是名字空间域或者全局域),依次由内到外到各个域进行名字查找,如果在某个域找到该名字的函数,就停止查找,将在该域找到的所有重载函数进行重载决议,如果没有合适的候选者或者有多个合适的候选者而导致歧义,编译器则报错。如果一直找到全局域也没有找到任何该名字函数,编译器也报错。

补充说明:
如果是通过一个类的实例调用类的成员函数,则应该是从该实例对应的类域开始,到该类的基类域(如果有基类的话),然后再是实例调用类的成员函数所处的域开始,接着如上所述(成员函数可以定义在外层,外外层。。。)。

ADL规则的意思就是和字面意思差不多,编译器根据实参的类型,去包含着这些类型的名字空间中去查找我们所要的函数定义或者名字。如果是类的话,那就可能包含了它的本身还有他所有基类的名字空间,如果是模板类的话,那就是定义原型模板的名字空间和所有模板实参的名字空间。(这个过程是要遍历完全并加入到候选函数中)

应该说,OL是名字查找的主要规则,只是在OL应用的某些阶段中KL也起作用,并将其作用附加在OL之上。

在继续阐述这一点之前,首先确认一个原则,类域比名字空间域(包括全局域)有更高的优先级,KL规则的作用范围是名字空间域里的自由函数,当OL应用于类域的成员函数的时候(当在类内成员函数间查找时就不会用KL,但进行到类外进行OL时,也会进行KL查找),KL是不起作用的。或者按照Herb的话说,成员函数与类之间的关系要比非成员函数更紧密(虽然都可以认为是类接口的一部分),当进行名字查找的时候,成员函数绝对不会跟非成员函数一起进行重载决议。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: