Suppose we have this code, copied from a separate question:
namespace x
{
void f()
{
}
class C
{
void f()
{
using x::f;
f(); // <==
}
};
}
The name f
on the indicated line unambiguously refers to x::f
(at least according to both gcc and clang). Why is x::f
preferred over x::C::f
in this case? Shouldn't it be ambiguous as both names are visible?
Because the using
declaration brings x::f
into the scope of f
, which is narrower than that of C
. Unqualified lookup considers the local block scope, finds a match, and stops before considering the wider class scope. There is no argument-dependent lookup since there are no function arguments, so no further scopes are considered.