【发布时间】:2021-06-20 17:35:23
【问题描述】:
template<typename ...T, typename U>
void fun(U){}
int main(){
fun(0);
}
GCC 和 Clang 都接受这个 sn-p 代码。模板形参包T在函数调用上下文中不参与模板实参推演,规则如下:
[temp.deduct.call]
模板参数推导是通过比较每个函数模板参数类型(称为P),其中包含模板参数参与模板参数推导的类型调用的相应参数(称为 A),如下所述。
包T 包含在任何函数模板参数中。如果没有其他特殊规则,则根据:
[temp.deduct.type#2]
如果任何模板参数既没有推导也没有明确指定,则模板参数推导失败。
但是,这种情况是由当前标准中的以下规则来裁定的,即: [temp.arg.explicit#4]
一个尾随模板参数包 ([temp.variadic])不会以其他方式推导将推导为模板参数的空序列。
因此,可以认为上面的情况可以成功地推导出包T 带有一组空的模板参数。
但是,temp.arg.explicit#4 中的特殊规则已更改为当前草案中的注释
[注 1:未以其他方式推导的尾随模板参数包 ([temp.variadic]) 将推导为模板参数的空序列。 ——尾注]
所以,我想知道当前草案中是否有任何替代的规范性规则规定包T 没有以其他方式推断将被推断为一组空的模板参数?
【问题讨论】:
标签: c++ templates language-lawyer