2011-08-03 9 views
5

点ISO C++ドラフト(n3290)から:ISO C++ドラフト - 3.4.2/3 - 実引数依存の名前探索

3.4.2/3実引数依存の名前探索:

Xをunqualired lookup(3.4.1)と によって生成されたルックアップセットとし、Yを引数依存ルックアップ (以下のように定義される)によって生成されたルックアップセットとする。 using宣言ないX

  • クラスメンバの宣言(#1)又は
  • ブロックスコープの機能が含まれている場合 宣言され(#2)または
  • 宣言 ファンクションまたはファンクションテンプレート(#3)もありません。#

次にYは空です。それ以外の場合、Yは、後述の引数型に関連付けられた名前空間 にある宣言のセットです。 名前の検索で見つかった一連の宣言は、 のXYです。

#1、#2、#3を含むADLを示すサンプルコードスニペットはありますか?

答えて

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があれば、それだけです!他の場所を探す必要はありません。私は信じて

ナンバー2は、コードが可能な場合は、そこに宣言した関数fを呼び出そうと、そうでない場合はあきらめます似ていますが、ブロック内の

{ 
    void f(double); 

    f(42); 
} 

番号3も同じです。 Nという名前を探して、その名前で関数ではないものを見つけると、オーバーロードを探す必要はありません。

0

これは価値があるため、これはKoenig Lookupとも呼ばれます。私は手に3のすべての例を持っていないが、ボ・ペルソンはすでにいくつかを提供している。

関連する問題