ISO C ++草案(n3290)中的一点:
3.4.2 / 3参数依赖名称查找:
让
X
成为由不等式查找(3.4.1)和 letY
是由参数依赖查找生成的查找集 (定义如下)。如果X
包含
- 集体成员(#1)或
的声明- 块范围函数 声明不是使用声明(#2)或
- 声明 这既不是功能模板也不是功能模板(#3)
然后
Y
为空。否则Y
是在中找到的声明集 与参数类型相关联的名称空间如下所述。 通过查找名称找到的声明集是unionX
和Y
。
是否有示例代码段演示了涉及#1,#2和#3的ADL?
答案 0 :(得分:3)
我认为此代码涵盖了所有案例(也可在http://ideone.com/CbyJv处获得)。如果你没有在ideone中选择C ++ 0x,那么允许使用#2(但是gcc 4.5.2会捕获它)。
#include <iostream>
// ::f
void f (int i) { std::cout << "::f\n" ; }
// Simple case
void OK1() {
f (99) ; // Calls ::f
}
// Argument-dependend lookup
namespace MyNamespace {
struct S { int i ; } ;
void f (S& s) { std::cout << "MyNamespace::f\n" ; }
}
void OK2() {
MyNamespace::S s ;
f (99) ; // Calls ::f
f (s) ; // Calls MyNamespace::f because the type of s is declared in MyNamespace
}
// Declaration of a class member (#1)
struct C {
static void ERROR1() {
MyNamespace::S s ;
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#1)
}
static void f() { // Declaration of a class member (#1)
std::cout << "C::f\n" ;
}
} ;
// Block-scope function declaration (#2)
void ERROR2() {
void f() ; // Block-scope function declaration (#2)
MyNamespace::S s ;
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#2)
}
// Declaration that is neither a function or a function template (#3)
void ERROR3() {
MyNamespace::S s ;
f (s) ; // OK: MyNamespace::f called
typedef int f[3] ; // Declaration that is neither a function or a function template (#3)
f (s) ; // Error: MyNamespace::f not matched, because Y is empty (#3). This is an initialiser
}
答案 1 :(得分:1)
数字1非常简单 - 如果你在一个类中寻找一个名字N,并且该类有一个成员N,那就是它!你不必去其他地方寻找。
我相信2号是相似的,但在一个区块内
{
void f(double);
f(42);
}
如果可能,代码将尝试调用在那里声明的函数f,否则放弃。
3号也是类似的。如果您查找名称N并找到具有该名称但不是函数的内容,则无需查找重载。
答案 2 :(得分:0)
对于它的价值,这也被称为Koenig Lookup。我没有所有3手的例子,但Bo Persson已经提供了一些。