我想了解为什么对下面的模板f
的调用无法编译:
struct A
{
template<class...>
friend void f(A) { }
} x;
int main()
{
f<>(x);
}
ADL要求函数调用中的后缀表达式为非限定id。简单模板ID(f<>
)不是非限定ID吗?
答案 0 :(得分:2)
相关条款似乎是7.3.1.2 [namespace.memdef]第3段:
首先在名称空间中声明的每个名称都是该名称空间的成员。如果非本地类中的友元声明首先声明了类,函数,类模板或函数模板,则该友元是最内部封闭命名空间的成员。友元声明本身不会使名称对非限定查找(3.4.1)或限定查找(3.4.3)可见。 ...
也就是说,找到这个名字的唯一方法是通过ADL。但是,要应用模板参数,需要根据14.2 [temp.names]第2段找到名称:
对于要由模板参数显式限定的模板名称,必须知道名称才能引用模板。