安东尼·威廉姆斯在他最近的博客文章中谈到了隐藏的朋友。如果我理解正确的话,主要思想是在某些情况下 ADL 无法找到声明为友元的函数。简单的例子:
namespace N {
struct A {
friend void foo(A) { }
};
struct B {
operator A();
};
// (*)
void bar(A) { }
}
void func() {
N::A a;
bar(a); // OK, bar is found via ADL
foo(a); // OK, foo is found via ADL
N::B b;
bar(b); // OK, bar is found via ADL
foo(b); // NOT OK, foo cannot be found
}
Run Code Online (Sandbox Code Playgroud)
在博客文章的所有示例中,友元函数都是在类内定义的。是否可以声明一个友元函数,然后在该点定义它(*),以便它保持隐藏状态?看起来隐藏的朋友只能在类范围(或另一个编译单元)中定义。