I think that internal declarations obscure those contained in the global namespace. In addition, friend declarations themselves are forwarded declarations, so they obscure them in the global namespace, rather than simply โreferencingโ these functions.
Referring to 3.3.10.1 "Hiding the Name" in N3485:
A name can be hidden by explicitly declaring the same name in a nested declarative region or derived class (10.2).
11.3.4 Friends:
A function declared in a friend declaration has an external binding (3.5). Otherwise, the function retains the previous relationship (7.1.1).
A look at 3.5.2:
If the name has an external connection, the object that it designates may be referred to by names from areas of other translation units or from other areas of the same translation unit.
source share