C++必知必会之(25)实参相依的查找

原创 2013年12月04日 10:27:37

1、实参相依的查找ADL:

当查找一个函数调用表达式中的函数名字时,编译器也会到“包含函数调用实参的类型”的名字空间中检查。

例如:

namespace org_semantics  {

      class X  { .... };

       void f ( const X & );

       void g ( X * );

       X operator + ( const X &, const X &);

       class String {   ....   };

       std::ostream operator << ( std::ostream &,  const String & );

}

//.....

int g ( org_semantics::X * );

void aFunc( )   {

     org_semantics::X  a;

     f ( a);                  //调用org_semantics::f

     g ( a);                //错误,调用具有歧义

     a = a + a;            //调用org_semantics::operator+

}

普通的查找是不会发现函数org_semantics::f的,因为它被嵌套在一个名字空间内,并且对f的使用需要以该名字空间的名字加以限定。

然而,由于实参a的类型被定义于org_semantics名字空间中,因此,编译器也会到该名字空间中检查候选函数。


本例中,程序员本来以为编译器会发现全局的g,但由于实参的类型是org_sematics::X *,因此该名字空间内的g成了候选函数之一,从而导致这个调用有歧义。

即使对g的调用导致了两个候选函数参与重载解析,::g实际上也并未重载org_sematics::g,因为它们不是声明于同一个作用域中的(参考重载与重写并不同)。

ADL是关于函数如何被调用的一个属性,而重载是关于函数被如何声明的一个属性。


2、可以看到ADL在对重载操作符的中缀调用中发挥作用,例如在aFunc中对operator + 的调用。

在这里,中缀表达式a+a等价于operator+( a,a),ADL将会在org_sematics名字空间中发现重载的operator+。


3、实际上,好多人广泛地应用了ADL但没意识到这点。考虑如下对<iostream>的常见使用:

org_sematics::String name( " Qwan" );

std::cout<<" Hello"<<name;

本例中,对operator<<的第一个使用(即最左边那一个),极有可能调用的是类模版std::basic_ostream的一个成员函数,而第二个则是对位于org_semantics名字空间中重载的operator<<的非成员函数的调用。ADL自动的打理了这些。

《SQL必知必会》(1-7)

《SQL必知必会》读书笔记 说明:本书SQL语句均使用PLSQL Developer客户端,在oracle数据库中实践。 1. 基本概念 表(table):某种特定类型数据的结构化清单。 模式...
  • Regina_niu
  • Regina_niu
  • 2016年12月21日 09:33
  • 519

C++必知必会(1)

条款1数据抽象 抽象数据类型的用途在于将变成语言扩展到一个特定的问题领域。一般对抽象数据类型的定义需要准训以下步骤: 1.     为类型取一个描述性的名字 2.     列出类型所能执行的操作...
  • walkerkalr
  • walkerkalr
  • 2014年05月23日 19:38
  • 971

2017最新hadoop前置课程大数据开发之Linux必知必会(centos6.4)

目录 第1章 Linux 基本环境 1.1、 大数据Hadoop前置课程大纲讲解.mp4 1.2、 常见Linux系统,安装VMWare及虚拟机.mp4 1.3、 导入已安装好虚拟机及如何设置...
  • yiqizixueba
  • yiqizixueba
  • 2017年11月09日 23:17
  • 45

《SQL必知必会》学习笔记(一):实验数据初始化

摘要:本文主要提供《SQL必知必会》一书中实验所用的数据库,以及创建数据库、表、约束和初始化的SQL语句。...
  • zwxtfqd
  • zwxtfqd
  • 2015年11月18日 16:00
  • 2209

《MySQL必知必会》全书总结

知识点回顾
  • sinat_28978689
  • sinat_28978689
  • 2017年02月21日 21:08
  • 1794

SQL必知必会 第4版pdf

下载地址:网盘下载 内容简介  · · · · · · SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能。 本书是深受世界...
  • cf406061841
  • cf406061841
  • 2017年06月03日 23:18
  • 5033

mysql必知必会pdf

下载地址:网盘下载 内容简介 编辑 《MySQL必知必会》注重实用性,操作性很强,适用于广大软件开发和数据库管理人员学习参考。 作者简介 编辑...
  • cf406061841
  • cf406061841
  • 2017年06月03日 22:55
  • 828

SQL必知必会

1 不能部分使用distinct,distinct作用于所有的列。 2 多用 in,not,少用,and or 加()的组合,因为前者的语义更明确一切。 3...
  • lllliulin
  • lllliulin
  • 2015年11月02日 16:55
  • 696

SQL必知必会学习笔记大总结

第一课:了解SQL 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。注意误用混淆:数据库软件被称为DBMS,数据库是通过DBMS创建和操纵的容器模式:关于数据库和表的布局及特性的信...
  • basycia
  • basycia
  • 2016年09月11日 11:31
  • 2405

正则表达式必知必会(修订版)整理教程

正则表达式必知必会(修订版)整理教程 1.   正则表达式入门 1.1  用途:是一种工具,主要用途是搜索变化多端的文本。匹配       到我们想要的信息。 1.2  使用正则表达式:在线测试工具:...
  • T1DMzks
  • T1DMzks
  • 2016年07月03日 01:33
  • 10557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++必知必会之(25)实参相依的查找
举报原因:
原因补充:

(最多只允许输入30个字)