Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328916
  • 博文数量: 79
  • 博客积分: 2466
  • 博客等级: 大尉
  • 技术积分: 880
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-07 16:47
文章分类

全部博文(79)

文章存档

2014年(3)

2012年(7)

2011年(14)

2010年(2)

2009年(2)

2008年(2)

2007年(18)

2006年(31)

分类: C/C++

2011-08-06 16:24:03

c++语言中有所谓的参数依赖查找(Argument Dependent Lookup)。这种查找规则适用于非限定的函数名查找,查找过程依赖于调用该函数时提供的参数类型。这种行为也被称为Koenig lookup,因为这是Andrew Koenig发明的。

下面的例子来自
namespace A { 
 struct X; 
 struct Y; 
 void f( int ); 
 void g( X ); 
 } 

 namespace B { 
 void f( int i ) { f( i ); // which f()? } 
 void g( A::X x ) { g( x ); // which g()? } 
 }

第一个函数调用f()调用的是他自己,这是一个无限递归。名字空间A中有一个同名、同参数类型的函数f。如果在名字空间B中有
using A::f;
这样的声明,A::f(int)就也是可见的,编译的时候两个f(int)函数就会冲突。

g()这个调用是有歧义的,必须用明确限定调用的是哪一个g()。
这个调用为什么是有歧义的?既然名字空间B中并未导入A中的任何函数,为什么还会冲突?原因就在于所谓的Koenig lookup:
如果函数的参数类型是一个类(相对于基本类型),在查找函数名的时候,编译器要将包含参数类型的那个名字空间考虑在内。

所以在查找名字g()的时候,名字空间A和B会同时被考虑,g有两个定义,因此这个调用是有歧义的。注意基本类型是不会引起Koenig lookup的,所以第一个对f()的调用是无歧义的,不会查找到A::f()。
阅读(826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~