6

C++ の標準 ADL 解決について質問があります。

私の問い合わせを説明するサンプルコードは次のとおりです。

#include <string>

// The mechanism:
namespace A {

 template< class C >
 ::std::string scope(const C*)
 { return "A"; }

 namespace B {

  template< class C >
  ::std::string scope(const C *foo)
  { return A::scope(foo)+"::B"; }

 } // namespace B
} // namespace A

::std::string scope(...)
{ return ""; }

// The test classes
struct foo {};
namespace A {
 struct foo {};
 namespace B {
  struct foo {};
 }
}

// The usage
int main()
{
  foo *Foo=0;
  A::foo *FooA=0;
  A::B::foo *FooB=0;

  scope(Foo);  // OK, returns ""
  scope(FooA); // OK, returns "A"
  scope(FooB); // On one compiler, OK returns "A::B" ; On another, compiler error "Ambiguous call" between A::scope() and A::B::scope()
}

それで、私の質問は、ADLに関する基準は何ですか? 引数の親名前空間からのすべての関数を見つける必要がありますか、または引数 + グローバル関数の (ネストされた) 名前空間で使用可能な関数のみを見つける必要がありますか?

このプログラムは MSVC 2008 でテストされています (SP でコンパイルされますが、SP なしではコンパイルされません...)。

4

1 に答える 1

6

標準によると、ADL は (いくつかの特別な規則を法として) 関数名の前に名前空間があるかのように機能します。あなたの最後の行では、あなたが書いたかのようにルックアップが先行するはずですA::B::scope. 周囲の名前空間を見ていません。

namespace 内であってもA::B、あいまいさがないことに注意してください。で A::BA::B::scope非表示にしA::scopeます。非修飾名の検索は、名前が最初に見つかったスコープで停止します。

于 2011-05-12T09:38:34.403 に答える