#c #standards #argument-dependent-lookup
#c #стандарты #зависящий от аргумента поиск
Вопрос:
У меня есть вопрос относительно стандартного разрешения 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 (и компилируется с SP, но не без …)
Комментарии:
1. Ваш код даже не будет компилироваться ни на ОДНОМ компиляторе, поскольку
A::scope()
который не принимает никаких параметров, не существует, и все же вы вызываете эту функцию.2. Один компилятор старый, а другой новый, или они от разных производителей?
3. @Bo Persson -> Оба компилятора одинаковы, т.Е. MSVC поставляется с Visual Studio 2008, но один с установленными последними обновлениями (работает), а другой нет (ошибка компиляции)
Ответ №1:
Согласно стандарту, ADL работает (по модулю пары специальных правил) «как если бы» имени функции предшествовало пространство имен; в вашей последней строке поиск должен предшествовать, как если бы вы написали A::B::scope
. Который не просматривается в окружающих пространствах имен.
Обратите внимание, что даже внутри пространства имен A::B
не было бы никакой двусмысленности; в A::B
, A::B::scope
скрывается A::scope
. Поиск по неквалифицированному имени останавливается в области, где он впервые находит имя.
Комментарии:
1. Спасибо, Джеймс, это именно то, что я подумал 🙂 Итак, чтобы продолжить, мой код должен компилироваться без какой-либо ошибки компилятора, вызванной двусмысленностью… опять проблема соответствия стандарту из MSVC, не так ли :/
2. @DocZeD Просто любопытно, а какая версия VC?