我对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进行编译,但并非没有......)
答案 0 :(得分:5)
根据标准,ADL工作(以模数为特殊规则)
“好像”函数名称前面是命名空间;在你的最后
行,查找应该在您编写A::B::scope
之前。哪一个
不会查看周围的命名空间。
请注意,即使在命名空间A::B
内,也不会有歧义;在
A::B
,A::B::scope
隐藏A::scope
。不合格的名称查找停止
在它首次找到名称的范围内。