• 即在一个名称作为调用运算符的左操作数时,并且这个名字是一个无限定名称时,在无限定查找到的名字集合中额外增加的一个规则使集合范围扩大(从而可以定位到其他一些限定名称),通常是用来保证定义在不同命名空间的运算符得以直接调用而非使用到全部名字(在限定符号存在的情况下,必须包含完整的名字例如+ => 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 指令

C++ ADL的更多相关文章

  1. 参数依赖查找(ADL,Argument-dependent lookup)

    参数依赖查找(Argument-dependent lookup),又称 ADL 或 Koenig 查找,是一组于函数调用表达式查找非限定函数名的规则,包含对重载运算符的隐式函数调用.在通常非限定名称 ...

  2. c++11-17 模板核心知识(十三)—— 名称查找与ADL

    名称分类 名称查找 ordinary lookup ADL (Argument-Dependent Lookup) 官网的例子 ADL的缺点 在C++中,如果编译器遇到一个名称,它会寻找这个名称代表什 ...

  3. ADL & 实参相依的查找 & 成员与非成员的查找

    也就是会根据实参,所处在的名字空间,来查找对应名字空间里面的函数. 对于<<也是常见的场景,会根据实际要打印出来的下一个操作数,来决定调用哪个命名空间里面的函数. 注意,不同命名空间里面的 ...

  4. chose.jquery 联动

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. OpenWebGlobe-开源三维GIS初体验(附源码和演示)

    1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...

  6. [c++] Copy Control

    C++ allows the programmer to define how objects are to be copied, moved, assigned and destroyed. Tog ...

  7. iOS项目开发中的知识点与问题收集整理②(Part 二)

    1.点击UIButton 无法产生触摸事件    如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置UIImageView的userInteractio ...

  8. python 学习笔记二十 django项目bbs论坛

    项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可 ...

  9. [AIR] AIR 应用程序的调用和终止

    本节讨论几种对已安装的 Adobe® AIR® 应用程序进行调用的方法,以及关闭运行中的应用程序的选项和注意事项. 注: NativeApplication.InvokeEvent 和 Browser ...

随机推荐

  1. 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中

    参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...

  2. PowerDesigner如何将字段的注释显示出来

    选定一个编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷键Ctrl+U)- >Comme ...

  3. Python网络爬虫(二)

    Urllib库之解析链接 Urllib库里有一个parse这个模块,定义了处理URL的标准接口,实现 URL 各部分的抽取,合并以及链接转换.它支持如下协议的 URL 处理:file.ftp.goph ...

  4. Poj 2096 (dp求期望 入门)

    / dp求期望的题. 题意:一个软件有s个子系统,会产生n种bug. 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中. 求找到所有的n种bug,且每个子系统都找到bug,这样所要 ...

  5. 移动端APP第一次登录和自动登录流程

    App登陆保存数据流程App因为要实现自动登陆功能,所以必然要保存一些凭据,所以比较复杂. App登陆要实现的功能: 密码不会明文存储,并且不能反编绎解密: 在服务器端可以控制App端的登陆有效性,防 ...

  6. 转 GTID复制的搭建和问题处理

    ########sample 1: 了解mysqldump 和 mysqlbackup  和 gtid_executed 和 gtid_purged https://www.linuxidc.com/ ...

  7. 008 String to Integer (atoi) 字符串转换为整数

    详见:https://leetcode.com/problems/string-to-integer-atoi/description/ 实现语言:Java class Solution { publ ...

  8. (转)Mysql数据库之Binlog日志使用总结Linux下用户组、文件权限详解

    Linux下用户组.文件权限详解 原文:http://blog.csdn.net/sdulibh/article/details/51566772 用户组 在linux中的每个用户必须属于一个组,不能 ...

  9. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch

    前言 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector. 1.<从0到1学习Flink>-- Data Source 介绍 2.<从0到1 ...

  10. VMware下linux与window文件夹共享

    这里说的是在虚拟机下来实现在windows下共享一个文件夹. 下面来说明一下是如何实现的: 1.  安装VMware.Workstation. 2.  安装Redhat Linux 9.0,在虚拟机下 ...