他大概意思是:
struct foo{
friend void bar(foo* z){} //not static, its friend now
};
foo* z;
bar(z); //fine now
但随后在技术上bar()
不内foo
。在foo
的封闭命名空间中仍然是仍然。
-
编辑:
他确实意味着friend
,为he said(重点煤矿):
最好的例子是内部定义一个朋友功能类型
他的例子进一步说明。可能你需要阅读“内部定义”,而不是“内部”。 “规定”
这个词是所有使其中的差别,因为它看起来像功能的名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
,即使引入命名空间Demo
,隐藏,从而不能使用平常的名字 - 外部使用查询:
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
希望有帮助。
Bump ...发布的答案没有解决为什么ADL在此代码中找不到“bar”的问题,它会转而讨论朋友函数 –