C++ ADL未拾取带有模板参数列表的后缀表达式
我想了解为什么对下面模板C++ ADL未拾取带有模板参数列表的后缀表达式,c++,c++11,argument-dependent-lookup,C++,C++11,Argument Dependent Lookup,我想了解为什么对下面模板f的调用无法编译: struct A { template<class...> friend void f(A) { } } x; int main() { f<>(x); } 结构A { 模板 f(A){} }x; int main() { f(x); } ADL要求函数调用中的后缀表达式为非限定id。简单模板id(f)不是非限定id吗?相关条款似乎是7.3.1.2[namespace.memdef]第3段: 在命名
f
的调用无法编译:
struct A
{
template<class...>
friend void f(A) { }
} x;
int main()
{
f<>(x);
}
结构A
{
模板
f(A){}
}x;
int main()
{
f(x);
}
ADL要求函数调用中的后缀表达式为非限定id。简单模板id(
f
)不是非限定id吗?相关条款似乎是7.3.1.2[namespace.memdef]第3段:
在命名空间中首先声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明类、函数、类模板或函数模板,则友元是最内层封闭命名空间的成员。友元声明本身不会使名称对非限定查找(3.4.1)或限定查找(3.4.3)可见
也就是说,找到这个名字的唯一方法是通过ADL。但是,要应用模板参数,需要根据14.2[临时名称]第2段找到名称:
对于要由模板参数显式限定的模板名称,必须知道该名称才能引用模板
在g++4.9中编译得很好,但在clang++EDG中编译得不好。EDG的前端说
f
未定义。您是否提交了错误报告?代码仍然在gcc6头上编译,它不应该编译。@vsoftco@0x499602D2 Hmm,已经6年了,仍然很强大:)