「引数依存ルックアップ」(別名ADL、または「Koenigルックアップ」)とは何ですか?

どのような引数の依存関係の検索の良い説明は何ですか?多くの人々もKoenig Lookupと呼んでいます。

私は知りたいのですが、

  • なぜそれは良いことですか?
  • それはなぜ悪いことですか?
  • どのように機能するのですか?
ベストアンサー

Koenig Lookup, or Argument Dependent Lookup,
describes how unqualified names are looked up by the compiler in
C++.

C ++ 11標準§3.4.2/1では次のように述べています。

関数呼び出し(5.2.2)のpostfix-expressionが非修飾-idの場合、通常の非修飾ルックアップ(3.4.1)中に考慮されない他の名前空間が検索され、それらの名前空間では、namespace-scope
friend他に見えない関数宣言(11.3)が見つかるかもしれません。これらの検索の変更は、引数の型によって異なります(テンプレートテンプレート引数の場合は、テンプレートの名前空間
  引数)。

もっと簡単な言葉で言えば、Nicolai Josuttisは 1

1つ以上の引数型が関数の名前空間で定義されている場合、関数の名前空間を修飾する必要はありません。

簡単なコード例:

namespace MyNamespace
{
    class MyClass {};
    void doSomething(MyClass);
}

MyNamespace::MyClass obj;//global object


int main()
{
    doSomething(obj);//Works Fine - MyNamespace::doSomething() is called.
}

上記の例では、 using – 宣言も using
指示もありませんが、コンパイラは未定義の名前 doSomething()Koenig
lookup
を適用して、名前空間 MyNamespace で関数を宣言しました。

どのように機能するのですか?

このアルゴリズムは、ローカルスコープだけでなく、引数の型を含む名前空間も調べるようにコンパイラに指示します。したがって、上記のコードでは、関数
doSomething()の引数であるオブジェクト obj
MyNamespace <�コード>。そこで、その名前空間を調べて
doSomething()の宣言を探します。

Koenigルックアップの利点は何ですか?

上記の簡単なコード例が上に示したように、Koenigルックアップは利便性と使いやすさをプログラマーに提供します。
Koenigルックアップがなければ、プログラマーに完全修飾名を繰り返し指定するか、代わりに using
宣言を使用するオーバーヘッドがあります。

なぜKoenigルックアップの批判?

Koenigルックアップに過度に依存すると、意味上の問題が発生し、時にはプログラマを逃れさせることがあります。

std :: swap
は、2つの値を交換するための標準ライブラリアルゴリズムです。
Koenigルックアップでは、以下の理由からこのアルゴリズムを使用する際には注意が必要です。

std::swap(obj1,obj2);

同じ動作をしないかもしれません:

using std::swap;
swap(obj1, obj2);

ADLでは、どのバージョンの swap
関数が呼び出されるのかは、渡された引数の名前空間に依存します。

If there exists an namespace A and if
A::obj1, A::obj2 & A::swap()
exist then the second example will result in a call to
A::swap(), which might not be what the user
wanted.

Further, if for some reason both A::swap(A::MyClass&,
A::MyClass&)
and std::swap(A::MyClass&,
A::MyClass&)
are defined, then the first example will
call std::swap(A::MyClass&, A::MyClass&) but
the second will not compile because swap(obj1, obj2)
would be ambiguous.

トリビア:

なぜそれは “Koenigルックアップ”と呼ばれていますか?

Because it was devised by former AT&T and Bell Labs
researcher and programmer, Andrew Koenig.

参考文献:


1 The definition of Koenig
lookup is as defined in Josuttis’ book, The C++ Standard Library: A Tutorial and
Reference
.

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です