13 函数模板实参推导
13.1 从函数调用进行推导 [temp.deduct.call.scpp]
除本小节明确修改的部分外,[temp.deduct.call] 原样适用于 SCPP26 程序里从函数调用进行的模板实参推导。
在一个函数形参列表中,函数参数包只能作为该列表里的最后一个参数声明出现。
从函数调用进行的推导,是针对整个函数形参列表完成的。一个较早函数形参 与其对应实参之间的兼容性,在所有较晚、且不是 defaulted 的函数形参都被 纳入推导之前,不得被最终确定。
如果某个函数形参 P 的类型包含一个模板参数包
Args...,而这个参数包 是在一个或多个较晚函数形参处才第一次被直接推导出来,那么实现必须:
(4.1) 先根据这些较晚的推导来源,确定 Args...
的最终绑定;
(4.2) 再把该绑定代换进 P;并且
(4.3) 最后再判断对应实参是否满足经此代换后的 P。
如果 (4.2) 中经代换后的类型不能被对应实参满足,则程序不合法 (ill-formed)。
本小节不会据此允许一个“非最后位置的函数参数包”;即使按 (4) 的方式 进行推导,(2) 仍然适用。