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 编译,但并非没有...)

4

1 回答 1

6

根据标准,ADL 的工作方式(以几个特殊规则为模)“好像”函数名前面有命名空间;在你的最后一行,查找应该在前面,就好像你写了A::B::scope. 这不会在周围的名称空间中查找。

请注意,即使在 namespaceA::B中,也不会有歧义;在 A::BA::B::scope隐藏A::scope。非限定名称查找在它首先找到名称的范围内停止。

于 2011-05-12T09:38:34.403 回答