【发布时间】:2015-11-29 04:35:01
【问题描述】:
N4527 14.8.2.4 [temp.deduct.partial]
3 用于确定排序的类型取决于完成部分排序的上下文:
(3.1) — 在函数调用的上下文中,使用的类型是函数调用具有参数的函数参数类型。
(3.2) — 在调用转换函数的上下文中,使用转换函数模板的返回类型。
(3.3) — 在其他上下文 (14.5.6.2) 中使用函数模板的函数类型。
4 上面从参数模板中指定的每个类型以及从参数中指定的相应类型 模板用作
P和A的类型。8 如果
A是从函数参数包转换而来的,而P不是参数包,则类型推导失败。 否则,使用结果类型P和A,然后按照 14.8.2.5 中的描述进行扣除。如果P是一个函数参数包,参数模板的每个剩余参数类型的类型A是 与函数参数包的 declarator-id 的类型P相比。每次比较都推导出 由函数扩展的模板参数包中后续位置的模板参数 参数包。如果给定类型的推导成功,则考虑参数模板中的类型 至少与参数模板中的类型一样专业。 [ 例子:
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?
我需要更多详细信息,包括:
1 是哪个上下文?
2 转换后的来源是什么?
例如#1 的转换 from 是 void (U) , void (U...) 还是其他形式?(U 表示唯一类型)
14.5.6.2 [temp.func.order]/p3
为每个类型、非类型或模板模板参数(包括 模板参数包(14.5.3))分别合成一个唯一的类型、值或类模板 并将其替换为模板函数类型中该参数的每次出现。
3 推演中P和A有哪些类型?例如
template <class T> void f(T);
int a = 1;
f(a);//P = T, A = int
【问题讨论】:
标签: c++ templates c++11 variadic-templates overload-resolution