以下是在clang中编译但不在gcc中编译:
template <class... Ts, class... Args>
void f(Ts&&..., Args&&...);
int main()
{
f();
}
这是我在GCC中遇到的错误:
main.cpp: In function 'int main()':
main.cpp:30:7: error: no matching function for call to 'f()'
f();
^
main.cpp:30:7: note: candidate is:
main.cpp:23:6: note: template<class ... Ts, class ... Args> void f(Ts&& ..., Args&& ...)
void f(Ts&&..., Args&&...)
^
main.cpp:23:6: note: template argument deduction/substitution failed:
main.cpp:30:7: note: candidate expects 1 argument, 0 provided
f();
^
如果我给出f(0)
这样的论点,那么它会与GCC编译但不会与Clang编译。
clang错误:
main.cpp:30:5: error: no matching function for call to 'f'
f(0);
^
main.cpp:23:6: note: candidate function not viable: requires 0 arguments, but 1 was provided
void f(Ts&&..., Args&&...)
^
1 error generated.
如果我给出与函数参数相同数量的显式模板参数,那么它将与两个编译器(即f<int, int, int>(0, 0, 0)
)进行编译。
答案 0 :(得分:2)
确实推断出第二个模板参数包Args
:
不会以其他方式推断出的尾随模板参数包(14.5.3) 被推导出一个空的模板参数序列。
考虑到这一点,它也变得清晰,例如f<int>(0)
格式正确。但是,Ts
永远不会被推断出来。 [temp.deduct.call] / 1:
当函数参数包出现在非推导的上下文中时 (14.8.2.5),从不推断出该参数包的类型。
请注意,之前的引用不适用于Ts
,因为它不是尾随的。因此,纯粹的演绎总会失败。