带有模板参数列表的后缀表达式未被ADL拾取

时间:2015-01-18 02:45:15

标签: c++ c++11 argument-dependent-lookup

我想了解为什么对下面的模板f的调用无法编译:

struct A
{
    template<class...>
    friend void f(A) { }
} x;

int main()
{
    f<>(x);
}

ADL要求函数调用中的后缀表达式为非限定id。简单模板ID(f<>)不是非限定ID吗?

1 个答案:

答案 0 :(得分:2)

相关条款似乎是7.3.1.2 [namespace.memdef]第3段:

  

首先在名称空间中声明的每个名称都是该名称空间的成员。如果非本地类中的友元声明首先声明了类,函数,类模板或函数模板,则该友元是最内部封闭命名空间的成员。友元声明本身不会使名称对非限定查找(3.4.1)或限定查找(3.4.3)可见。 ...

也就是说,找到这个名字的唯一方法是通过ADL。但是,要应用模板参数,需要根据14.2 [temp.names]第2段找到名称:

  

对于要由模板参数显式限定的模板名称,必须知道名称才能引用模板。