普通的查找是不会发现函数ACE::find的,因为它嵌套在一个名字空间内,并且对find的使用需要以该名字空间的名字加以限定。然而,由于实参hw的类型被定义于ACE名字空间中,因此,编译器也会到该名字空间中检查候选函数。 2) 实际上,很多程序员广泛地使用了ADL却没意识到这一点,例如: ACE::String name("hw"); std::...
c++名称的普通查找规则为从名称所在的 scope 从内向外依次查找。 ADL( Argument-Dependent Lookup)查找为依赖于参数的查找,是用于函数调用表达式中查找非限定函数名称的规则。当在使用函数的上下文中找不到函数定义,我们可以在其参数的关联类和关联名字空间中查找该函数的定义。 ADL 生效条件:a.使用此规则的函数必须要...
原因:max()模板并不知道BigMath名字空间,因此普通查找也找不到应用于BigNumber类型值的operator<。如果没有特殊规则的话,这种限制会大大减少C++名字空间中的应用。ADL正式基于这个特殊规则,也是解决这种限制的关键之处
如果没有,则进行ADL查找。因此在经过普通的查找后,发现并没有匹配的函数,最后再经过ADL找到了标准库中的swap和外层作用域的void swap(ClassTest &a, ClassTest &b) noexcept,由于后者较匹配,编译器优先选择后者。 如果str类型有自定义的swap函数,那么第4行代码的swap调用将会调用str类型自定义的swap函数 但是如果s...
当查找一个函数调用表达式中的函数名字时,编译器也会到“包含函数调用实参的类型”的名字空间中检查(只限于当前查找)。 ADL是关于函数如何被调用的一个属性(并不是重载)。 26.操作符函数查找 对重载操作符的中缀调用执行一个退化形式的ADL,即当确定将哪些函数纳入重载解析考虑范围时,中缀操作符中左参数的类(可能只...
ADL(Argument-Dependent Lookup),参数依赖查找(实参依赖查找),也叫 Koenig 查找。是在函数调用表达式(包括对重载…阅读全文 赞同1添加评论 分享收藏喜欢 如何评价C++的实参依赖查找(ADL)? Timothy Liu 清华大学 网络空间安全博士在读 ADL 是一定要有的。 ADL 一个用处就是运算符重载...
4. 物理封装:只有模块显式声明为导出的实体才会对使用者可见。模块中未导出的实体不会影响其他模块中的名称查找(除了 ADL可能有一些不同之处【依赖实参的名字查找】,但这就说来话长了)。 5. 模块化接口:强制任何给定模块的公共接口在称为“模块接口单元”(MIU)的单个 TU 中声明。模块接口子集的实现可以在称为...
; // getline doesn't need the std:: prefix here because C++ has ADL.ADL代表依赖于参数的查找...
解释:参见无限定名字查找中实参依赖查找,又称 ADL 或 Koenig 查找 [1],是一组对函数调用表达式(包括对重载运算符的隐式函数调用)中的无限定的函数名进行查找的规则。在通常无限定名字查找所考虑的作用域和命名空间之外,还会在它的各个实参的命名空间中查找这些函数。 第四题 struct Base{ virtual void f() { ...
C++为什么有参数依赖查找(ADL)? 查找仅考虑命名空间、类类型、枚举和模板特化(它们是类型)。如果左侧找到的名称不是指一个命名空间或类、枚举或依赖类型,程序是不正确的(ill-formed)。...例如,对于类类型参数,包括该类本身、其所有直接和间接基类以及这些类最内层的包围命名空间。...为什么C++会有ADL为什...