最も一般的なケースでは答えはノーだと思いますが、ほとんどの実用的な実装ではイエスです。
C ++ISO標準§3.4.2/2によると、引数には「関連付けられた名前空間」の概念があり、これは次のような方法で定義されます。
Tがクラスタイプ(ユニオンを含む)の場合、関連するクラスは次のとおりです。クラス自体。メンバーであるクラス(ある場合)。およびその直接および間接の基本クラス。関連する名前空間は、関連するクラスが定義されている名前空間です。
これは、イテレータ型が実際にのようなコンテナ内のネストされた型である場合、は関連付けられたクラスであり、を含む名前空間std::set
であるため、の呼び出しでそのイテレータに関連付けられた名前空間は、にfind
なることを示しています。次に、規格は次のように述べています(§3.4.2/ 2a)std
std::set
std
set
名前の通常の非修飾ルックアップでクラスメンバー関数の宣言が見つかった場合、関連する名前空間とクラスは考慮されません。それ以外の場合、関数名のルックアップによって検出された宣言のセットは、通常の非修飾ルックアップを使用して検出された宣言のセットと、引数タイプに関連付けられた名前空間およびクラスで検出された宣言のセットの和集合です。
find
これは、実際に関数がで見つかることを意味しますnamespace std
。
ただし、これが一般的に機能することは保証されていません。また、仕様(§3.4.2)から次のことがわかります。
タイプを指定するために使用されるTypedef名とusing-declarationsは、このセットには寄与しません。
したがって、質問で述べたように、イテレータタイプがある種のtypedef
場合、これが正しく機能することは保証されません。しかし、それを除けば、型がtypedefでないことがわかっている場合はnamespace std
、のクラスにあるかネストされているnamespace std
必要があり、ADL用に取得する必要があるようです。 しかし、それをしないでください!:-)