普通的查找是不会发现函数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...
在C语言中,变量的名称是由程序员在编写代码时定义的。要查找C程序中的变量名称,可以使用以下方法: 1. 阅读源代码:直接阅读源代码以查找变量名称。 2. 使用编译器或预处理器:使用编译器或预处理器的...
如果我们没有using声明(第 5 行),对swap的调用(第 6 行)仍然会成功,对于一个在命名空间中定义的类型T,该命名空间中定义了T的swap重载——这要归功于参数相关查找(ADL)——X::Foo和X::swap就是这样的类型。然而,对于在全局命名空间中定义的类型,它会失败(假设你没有在全局命名空间中定义一个通用的swap)。
“new运算符”所调用的 operator new(size_t) 函数,按照C++的名字查找规则,首先做依赖于实参的名字查找(即ADL规则),在要申请内存的数据类型T的 内部(成员函数)、数据类型T定义处的命名空间查找;如果没有查找到,则直接调用全局的 ::operator new(size_t) 函数。 构造函数 在分配到的动态内存块上 初始化 ...
ADL(Argument-Dependent Lookup),参数依赖查找(实参依赖查找),也叫 Koenig 查找。是在函数调用表达式(包括对重载…阅读全文 赞同1添加评论 分享收藏喜欢 如何评价C++的实参依赖查找(ADL)? Timothy Liu 清华大学 网络空间安全博士在读 ADL 是一定要有的。 ADL 一个用处就是运算符重载...
; // getline doesn't need the std:: prefix here because C++ has ADL.ADL代表依赖于参数的查找...
解释:参见无限定名字查找中实参依赖查找,又称 ADL 或 Koenig 查找 [1],是一组对函数调用表达式(包括对重载运算符的隐式函数调用)中的无限定的函数名进行查找的规则。在通常无限定名字查找所考虑的作用域和命名空间之外,还会在它的各个实参的命名空间中查找这些函数。 第四题 struct Base{ virtual void f() { ...