【发布时间】:2021-08-02 16:53:41
【问题描述】:
这是来自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是从函数参数包转换而来的,它会与参数模板的每个剩余参数类型进行比较。
【问题讨论】:
标签: c++ templates c++17 language-lawyer