У меня есть вопрос относительно стандартного разрешения ADL в C ++.
Вот пример кода, объясняющего мой запрос:
#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 (и компилируется сИП но не без ...)