Argument-dependent name lookupとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > Argument-dependent name lookupの意味・解説 

実引数依存の名前探索

(Argument-dependent name lookup から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/07/04 16:24 UTC 版)

ナビゲーションに移動 検索に移動

実引数依存の名前探索じつひきすういぞんのなまえたんさくADL)とは、C++において関数呼出時に与えられた引数の型に依存して、呼び出す関数を探索 (lookup)する仕組みのことである。英語ではKoenig lookupargument dependent lookup (ADL)、argument dependent name lookupなどと呼ばれる。なお、Koenig lookupとは、この仕組みをAndrew Koenigが提案したことにちなむ。


概要

ADLでは、探索される名前空間は実引数に依存する。A型のオブジェクトが関数呼出の際に実引数として用いられると、Aに関連する名前空間(Aが含まれる名前空間とAの基底クラスが含まれる名前空間の和集合)からその関数が探索される。 探索の後、見つかった宣言の集合の中から多重定義の解決が行われる。 以下に例を示す。

namespace SomeSpace
{
    class A {};
    void f(A) {}
}
int main()
{
    SomeSpace::A a;
    f(a); // SomeSpace::f(a);と書かずとも、SomeSpace::fが呼ばれる。

    return 0;
}

標準C++ライブラリでは、ADLを主に演算子多重定義関数に対して用いている。たとえば次のプログラムはADLが無ければコンパイルできない。

#include <iostream>
#include <string>

int main()
{
    std::string msg = "Hello World, where did operator<<() come from?";
    std::cout << msg << std::endl;

    return 0;
}

std::ostream& std::operator <<(std::ostream&, const std::string&)と宣言された関数は、ADLによって見付かる(この関数はstd名前空間の中に存在することに注目)。ところで、std::endlは関数であるが、operator <<の引数として用いられているため、std::などといった完全な修飾が必要であることに注意。

インタフェース

C++ユーザからは、ADLで見つかる名前はクラスのインタフェースの一部と扱われる。

Standard Template Library (STL)では、一部のアルゴリズム関数がswap関数を修飾無しで呼んでいる。この場合、ADLで何も見つからなければ、stdのswap関数が呼ばれるが、ADLで見つかったときはそちらが呼ばれる。例えば、ある名前空間NSにクラスFooと関数swap(Foo&, Foo&)が定義されていると、アルゴリズム関数はNS::swap(Foo&, Foo&)を使用する。ただし、この挙動はC++03では規定されておらず、必ずしもそうなるとは限らない。C++0xで規定される見込みである。

問題点

ADLは自由関数(クラスのメンバ関数でない関数)もクラスのインタフェースとして扱う。つまり、名前空間に制限をもたらし、ADLの必要がなければ完全に修飾された名前を用いる必要があることを意味する。逆の例として、標準C++ライブラリは2つの値の交換にstd::swapを修飾なしで呼ぶことが挙げられる。

別の案として、std::swapをユーザに多重定義させるという方法がある。次のコードは挙動が異なる。

完全修飾した名前で呼ぶ場合:

std::swap(a, b);

予めusingしておく場合:

using std::swap;
swap(a, b);

ただし、aとbはN::Aという型とする。

N::swap(N::A&, N::A&)が存在した場合、後者ではそれが呼ばれるが、前者では呼ばれない。さらに細かいことを言えば、仮に両方とも定義されていたら、前者ではstd::swap(N::A&, N::A&)が呼ばれるが、後者ではどちらにするか曖昧になる(名前の探索に失敗しコンパイルエラーになる)。

なお、std::swapを特殊化するという方法もあるが、特殊化しようとする型がテンプレートの場合に対応できない(自由関数で部分特殊化はできない)ために完璧ではない[1]

なお、std名前空間での多重定義は現在認められていない(特殊化は認められている)。

一般にADLに過度に依存すると意味の問題が起こる。あるライブラリL1がL1::foo(T)が呼び出される前提で未修飾のfoo(T)という呼出を行っているとする。別のライブラリL2も同様にfoo(T)の呼出を行っている。2つのライブラリを同時に使うと、L1::foo(T)が呼ばれなければならない場面でL2::foo(T)が呼ばれるなど互いに意図するとおりにならない可能性が生じる。しかし、L1が内部でL1::foo(T)とし、L2も内部で同様にL2::foo(T)と共に完全に修飾していれば、このようなADLの心配は全く起こらない(逆にADLを起こしたい場合はusing L1::foo; foo(x);のように書く)。

脚注

[脚注の使い方]
  1. ^ Cryolite (2004年9月2日). “swapの特殊化・その他,細かいこと”. Cry's Diary. 2009年2月1日閲覧。

外部リンク


「Argument-dependent name lookup」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Argument-dependent name lookup」の関連用語

Argument-dependent name lookupのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Argument-dependent name lookupのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアの実引数依存の名前探索 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS