В приведенном ниже коде 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;
}
};