【发布时间】:2014-05-04 00:59:57
【问题描述】:
我试图让朋友姓名注入与以下 sn-p 一起工作:
struct foo
{
friend foo f() { return {}; }
};
int main()
{
auto x = f();
return 0;
}
编译失败:
test.cc:8:10: error: use of undeclared identifier 'f'
auto x = f();
^
1 error generated.
我必须在外部命名空间中声明 f 才能使错误消失。
该标准在 §7.3.1.2 的第 3 段中有解释:
如果一个朋友声明在一个 非本地类首先声明一个类、函数、类模板或函数模板97,友元是最内层封闭命名空间的成员。友元声明本身并不使名称对非限定查找 (3.4.1) 或限定查找 (3.4.3) 可见。 [注意:朋友的名字将在其命名空间中可见如果在命名空间范围内提供了匹配的声明(在授予友谊的类定义之前或之后)。 ——尾注]
我的问题:为什么我们需要在命名空间范围内额外声明 f 才能编译?跟ADL有关系吗?是否有解决此要求的(hacky)方法?
【问题讨论】:
-
如果你可以强制ADL,那么它会找到
f。