不参与推导的模板参数包推为空的现行规则草案中的规范规则是什么?
template<typename ...T, typename U>
void fun(U){}
int main(){
fun(0);
}
这个片段代码被 GCC 和 Clang 接受。模板参数包T不参与函数调用上下文中的模板参数推导,遵循以下规则:
[temp.deduct.call]
模板参数推导是通过将包含参与模板参数推导的模板参数的每个函数模板参数类型(称为 P)与调用的相应参数(称为 A)的类型进行比较来完成的,如下所述。
该包T包含在任何函数模板参数中。如果没有指定其他特殊规则,则扣除将根据:
[temp.deduct.type#2]
如果任何模板参数既未推导也未明确指定,则模板参数推导失败。
但是,这种情况在现行标准中是由以下规则来规定的,即:
[temp.arg.explicit#4]
未以其他方式推导的尾随模板参数包 ([temp.variadic])将推导为模板参数的空序列。
因此,上述情况可以被认为是成功地推导出T了一个空的模板参数集。
但是,temp.arg.explicit#4 中的特殊规则已更改为当前草案中的注释
[temp.arg.explicit#note-1]
[注 1:未以其他方式推导出的尾随模板参数包 ([temp.variadic]) 将推导出为模板参数的空序列。— 尾注]
所以,我想知道当前草案中是否有任何替代规范规则规定T未以其他方式推断的包将被推断为一组空的模板参数?