Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ADL未拾取带有模板参数列表的后缀表达式_C++_C++11_Argument Dependent Lookup - Fatal编程技术网

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年了,仍然很强大:)