If a friend declaration in a non-local class first declares a
class, function, class template or function template
the friend is a member of the innermost enclosing
namespace
. [
Note 2:
The name of the friend will be
visible in its namespace if a matching declaration is provided at namespace
scope (either before or after the class definition granting friendship)
. —
end note]
If a friend
function or function template is called, its name may be found by the
name lookup that considers functions from namespaces and classes
associated with the types of the function
arguments (
[basic.lookup.argdep])
. If the
name in a friend declaration is neither qualified nor a
template-id and the declaration is a function or an
elaborated-type-specifier, the lookup to determine whether
the entity has been previously declared shall not consider any scopes
outside the innermost enclosing namespace
. [
Note 3:
The other forms of
friend declarations cannot declare a new member of the innermost
enclosing namespace and thus follow the usual lookup rules
. —
end note]
[
Example 3:
void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X);
class Y {
friend void g();
friend void h(int);
friend void f2<>(int);
};
};
X x;
void g() { f(x); }
void f(X) { }
void h(int) { }
}
using A::x;
void h() {
A::f(x);
A::X::f(x);
A::X::Y::g();
}
—
end example]