他大概是这个意思:
struct foo{
friend void bar(foo* z){} //not static, its friend now
};
foo* z;
bar(z); //fine now
但从技术上讲bar()
是不在里面 foo
。它仍然在foo
.
--
编辑:
friend
正如他所说(强调我的) ,他确实是指:
最好的例子是在类型内部定义的友元函数
他的例子进一步说明了这一点。可能您需要阅读“内部定义”,而不仅仅是“内部”。
“定义”这个词是唯一的区别,因为看起来函数的名称 bar
被引入到类的范围中,但实际上,名称bar
被引入到封闭的命名空间中foo
(参见 §3.3.1/3- 4 和§11.3/6)。
这是一个更好的例子:
namespace Demo
{
struct foo
{
friend void bar(foo* z){}
};
}
foo *z;
bar(z); //foo (type of z) is inside Demo, so is bar
//(even though bar is defined inside foo!)
bar(NULL); //error - NULL doesn't help ADL.
bar(nullptr); //error - nullptr doesn't help ADL.
bar(static<foo*>(NULL)); //ok - ADL
请注意bar
,即使将 name 引入了 namespace Demo
,它也是 hidden,因此不能使用通常的 name-lookup 从外部使用:
using namespace Demo; //brings ALL (visible) names from Demo to current scope
bar(NULL); //STILL error - means bar is invisible
或者,
Demo::bar(NULL); //error - not found
Demo::foo::bar(NULL); //error - not found
希望有帮助。