Quoting an excerpt from C++ Primer (5th Edition) section “18.2.2. Using Namespace Members”
The scope of names introduced by a using directive is more complicated
than the scope of names in using declarations. As we’ve seen, a using
declaration puts the name in the same scope as that of the using
declaration itself. It is as if the using declaration declares a local alias for
the namespace member.A using directive does not declare local aliases. Rather, it has the effect
of lifting the namespace members into the nearest scope that contains
both the namespace itself and the using directive.This difference in scope between a using declaration and a using
directive stems directly from how these two facilities work. In the case of
a using declaration, we are simply making name directly accessible in the
local scope. In contrast, a using directive makes the entire contents of a
namespace available In general, a namespace might include definitions
that cannot appear in a local scope. As a consequence, a using directive
is treated as if it appeared in the nearest enclosing namespace scope.
So this difference in scope handling of using-directives compared to using-declarations is to not prevent identical names from being declared. When such name conflict occurs it will be permitted but any ambiguous usage must explicitly specify the intended version.