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

use*_*747 5 c++ name-lookup c++11

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

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

X是由unquali音响ED查找(3.4.1)中产生的查找组并且让Y是由参数依赖查找产生的查找集(德音响定义如下).如果X包含

  • 宣布集体成员(#1)或
  • 块范围函数声明,它不是using声明(#2)或
  • 声明既不是函数模板也不是函数模板(#3)

然后Y是空的.否则Y是在与参数类型相关联的名称空间中找到的声明集,如下所述.通过查找名称找到的声明集是X和的并集Y.

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

Ton*_*nyK 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
}
Run Code Online (Sandbox Code Playgroud)