C++17中模板参数包的偏序规则
这是来自temp.deduct.partial的示例。
template<class... Args> void f(Args... args); // #1
template<class T1, class... Args> void f(T1 a1, Args... args); // #2
template<class T1, class T2> void f(T1 a1, T2 a2); // #3
f(); // calls #1
f(1, 2, 3); // calls #2
f(1, 2); // calls #3; non-variadic template #3 is more specialized
// than the variadic templates #1 and #2
为什么f(1, 2, 3)叫#2?
在CWG1395之前很容易理解。#2不能推导出,#1因为Args是一个参数包而T1不是,所以#2比 更专业#1。
但是在CWG1395之后如何理解这个例子呢?似乎T1可以从Args现在开始推断。
类似地,如果
A是从函数参数包转换而来,则将其与参数模板的每个剩余参数类型进行比较。