Доступ к глобальному пространству имен C++ из другого пространства имен

В приведенном ниже коде C++ foobarопределяется сначала для одного параметра double, а затем снова для одного параметра типа Foo. Оба определены в глобальном пространстве имен.

В пространстве имен oneопределена дополнительная перегрузка foobarс одним параметром типа Bar. Начиная с этой версии foobar, безоговорочный вызов foobarс аргументом double(42.0 )завершится ошибкой. Аналогичный вызов foobar, на этот раз дополненный оператором разрешения области видимости (::), также с аргументом double, будет успешным.

С другой стороны, неквалифицированный вызов foobarс аргументом типа Fooзавершается успешно. Вызов foobarс аргументом Foo, уточненным оператором разрешения области действия, также завершается успешно.

Почему два сценария ведут себя по-разному? Я использую как gcc 4.7, так и clang++ 3.2.

struct Foo {};
struct Bar {};

double foobar(double x) { return x; }
Foo    foobar(Foo f)    { return f; }

namespace one {

  Bar foobar(Bar b) {
    //foobar(42.0); // error: can't convert to Bar
    ::foobar(42.0);

    Foo f;
      foobar(f);    // no problem
    ::foobar(f);
    return b;
  }
};
9
задан user2023370 8 August 2012 в 10:55
поделиться