ISO C ++ draft - 3.4.2 / 3 - 参数依赖名称查找

时间:2011-08-03 07:12:05

标签: c++ c++11 name-lookup

ISO C ++草案(n3290)中的一点:

  

3.4.2 / 3参数依赖名称查找:

     

X成为由不等式查找(3.4.1)和   let Y是由参数依赖查找生成的查找集   (定义如下)。如果X包含

     
      
  • 集体成员(#1)或
  • 的声明   
  • 块范围函数   声明不是使用声明(#2)或
  •   
  • 声明   这既不是功能模板也不是功能模板(#3)
  •   
     

然后Y为空。否则Y是在中找到的声明集   与参数类型相关联的名称空间如下所述。   通过查找名称找到的声明集是union   XY

是否有示例代码段演示了涉及#1,#2和#3的ADL?

3 个答案:

答案 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已经提供了一些。