C++ ADL
- 即在一个名称作为调用运算符的左操作数时,并且这个名字是一个无限定名称时,在无限定查找到的名字集合中额外增加的一个规则使集合范围扩大(从而可以定位到其他一些限定名称),通常是用来保证定义在不同命名空间的运算符得以直接调用而非使用到全部名字(在限定符号存在的情况下,必须包含完整的名字例如+ => operator + )
- 因此可以知道,ADL(argument dependent lookup)会发生在一个无限定函数名称调用时的名称查找过程中,但是若出现了,非ADL或函数本身是类成员(包括静态),块作用域内已经声明的(非using声明),非函数或函数模板时,则不会进行ADL.
- 对于参数依赖查找有以下规定:
- 若参数为:类类型,则查找范围是包含该类型的最内层名空间(或类)和类本身以及其直接或间接基类,并且如果存在inline时:
- 若包含了改类(基类)的名称空间inline于另一个名称空间,则另一个名称空间内的名字也可以被找到(或是存在另一个名称控件inline与该名称空间内),但是如果只是单纯的名称控件或类嵌套,在无限定查找不到的情况下是查找不到包含该类或名称空间的最内层名称空间(类)的外围名称空间(类)的,例子:
namespace N{
inline namespace NS1{
struct A{
friend void FuncA(A){} //在类内查找的只有友元,因为其他的均为类成员
};
void FN1(A){}
}
void FN(NS1::A){}
}
struct B:N::NS1::A{
friend void FuncB(B){}
};
namespace E{
namespace NS2{
struct C:B{
friend void FuncC(C){}
};
void FN2(C){}
inline namespace NiS2{
void FiS2(C){}
}
}
void FE(NS2::C){}
}
void foo(){
E::NS2::C s;
FN2(s);
FuncC(s);
FuncB(s);
FN1(s);
FuncA(s);
FN(s);
FiS2(s);
//FE(s); 查找不到
}
struct A{
struct B{
struct C{ };
friend void F(C){}
};
friend void F1(B::C){}
};
void foo(){
A::B::C s;
F(s);
//F1(s);
}
namespace N{
struct E{
struct A{
struct B{ };
};
friend void F2(A::B){}
};
void F(E::A::B){}
}
void Foo(){
N::E::A::B s;
F(s);
//F2(s);
}
- 若参数类型为模板的特化,该特化遵循上述规则外,对于每个模板类型实参,若为类类型的,遵循上述规则,若为模板模板形参则不会包含该模板模板形参在内,但是会包含该模板模板形参所被包含的(是其成员的)类或名称空间例:
template<template<class D>class TY,class ... Ty>
struct T{};
namespace N2{
struct B;
}
namespace N3{
struct N{
template<class D>
struct TY;
friend void F1(T<TY,N2::B>){}
};
}
namespace N1{
struct A{ };
void F3(T<N3::N::TY,N2::B>){}
}
namespace N2{
struct B:N1::A{ };
}
namespace N3{
template<class D>
struct N::TY{
friend void F4(T<TY,N2::B>){}
}; void F2(T<N::TY,N2::B>){}
}
void foo(){
T<N3::N::TY,N2::B> s;
F1(s);
F2(s);
F3(s);
//F4(s);
}
- 对于指针类型则对指针指向的类型进行上述检查除非:
- 该指针指向函数指针,则对该函数类型的返回值和参数进行上述检查
- 该指针是类成员指针
- 类成员函数指针,除了对函数参数和返回值进行上述检查之外还包括该类按照上述类规则检查
- 类数据成员指针,对该类按照上述类规则检查
- 补充点:
- 在类中除了成员函数的查找外,若在类外调用,如static成员函数,规定,为了进一步的ADL处理,将会忽略所有在类中找到的声明,除了引入到了其最内层名称空间内的(此时就说明了友元的引入位置,但是在类内定义的友元函数是无法直接用限定访问查找到的)
- 忽略查找集合(即上述所有规则中可以被查找到的位置)中的using 指令
- 若参数为:类类型,则查找范围是包含该类型的最内层名空间(或类)和类本身以及其直接或间接基类,并且如果存在inline时:
C++ ADL的更多相关文章
- 参数依赖查找(ADL,Argument-dependent lookup)
参数依赖查找(Argument-dependent lookup),又称 ADL 或 Koenig 查找,是一组于函数调用表达式查找非限定函数名的规则,包含对重载运算符的隐式函数调用.在通常非限定名称 ...
- c++11-17 模板核心知识(十三)—— 名称查找与ADL
名称分类 名称查找 ordinary lookup ADL (Argument-Dependent Lookup) 官网的例子 ADL的缺点 在C++中,如果编译器遇到一个名称,它会寻找这个名称代表什 ...
- ADL & 实参相依的查找 & 成员与非成员的查找
也就是会根据实参,所处在的名字空间,来查找对应名字空间里面的函数. 对于<<也是常见的场景,会根据实际要打印出来的下一个操作数,来决定调用哪个命名空间里面的函数. 注意,不同命名空间里面的 ...
- chose.jquery 联动
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- OpenWebGlobe-开源三维GIS初体验(附源码和演示)
1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...
- [c++] Copy Control
C++ allows the programmer to define how objects are to be copied, moved, assigned and destroyed. Tog ...
- iOS项目开发中的知识点与问题收集整理②(Part 二)
1.点击UIButton 无法产生触摸事件 如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置UIImageView的userInteractio ...
- python 学习笔记二十 django项目bbs论坛
项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...
- [AIR] AIR 应用程序的调用和终止
本节讨论几种对已安装的 Adobe® AIR® 应用程序进行调用的方法,以及关闭运行中的应用程序的选项和注意事项. 注: NativeApplication.InvokeEvent 和 Browser ...
随机推荐
- Selenium WebDriver原理(二):Selenium是如何操纵浏览器的?
前言 上一篇文章<selenium webdriver 是怎么运行的>用了一个简单的例子--搭出租车,形象地讲解selenium webdriver 是如何运行的,而这一篇文章可以理解为深 ...
- hive与hbase关联
进入hbase: hbase shell 进入HIVE: hive hbase中建一张t_student_info表,添加两个列族 create 't_student_info','st1','st2 ...
- 新手常见Python运行时错误
经过整理与在实际中遇到的问题,将新手经常遇到的汇总下,以便自己犯傻又这么干了 1)"SyntaxError :invalid syntax",语法错误 A.查看是否在 if , e ...
- eclipse自动添加版权信息
Preference->Java->Code Style->Code Template->comments->Files->Edit 勾选上Automaticall ...
- Java排序算法(一)
Java排序算法(一) 排序的基本概念和分类 1.1排序的定义 在<大话数据结构>中,排序定义为,假设含有n个记录的序列为{r1,r2,...,rn},其相应的关键字{k1,k2,..., ...
- Spring之Quartz定时任务和Cron表达式详解
1.定时业务逻辑类 public class ExpireJobTask { /** Logger */ private static final Logger logger = LoggerFact ...
- 记秋招第一个offer:去哪儿
9月17日 网申去哪儿,没有内推,因为网申了就不能内推了.难受,内推可以免简历筛选的,这下好了,可能简历直接挂了.我怎么犯了这么低级的错误?还没去搞清楚能不能内推就先傻乎乎地网申了. 9月28日 晚上 ...
- Callback, Promise和Async/Await的对比
Callback, Promise和Async/Await的对比 Callback Hell getData1(function (data1) { console.log('我得到data1了') ...
- Compaq Visual Fortran生成静态库的方法及使用
Compaq Visual Fortran 6.5生成lib静态库详细方法: 打开Compaq Visual Fortran,新建Fortran Static Library工程,命名为ForLib: ...
- SpringBoot JUnit4的断言和注解
Junit4的断言常用方法: assertArrayEquals( new Object[]{ studentService.likeName("小明2").size() > ...