using によって引っ張ってこられた関数と ADL

ADL の対象となる関数は対象となる名前空間に定義された関数だけで, using によって別の名前空間から名前だけ引っ張ってこられた関数は対象とならない.

namespace NS1{

struct X
{};

void f( X x )
{}

}

namespace NS2{

void g( X x )
{}

}

namespace NS1{

using NS2::g;

}



int main()
{
  NS1::X x;
  f( x ); // O.K. 引数 x による ADL で NS1 の f も探索の対象になる.
  g( x ); // NG. g は NS1 に using で引っ張ってこられただけなので ADL の対象外.

  return 0;
}