C++可变参数函数模板实参推导及显式指定规则疑问
C++可变模板参数推导规则说明
隐式模板参数推导规则
你遇到的推导结果符合C++标准的非推导上下文规则:
当函数模板的形参列表中,可变参数包Ts...不是最后一个形参(本例中后面紧跟了单个参数U),那么这个可变参数包属于非推导上下文,编译器不会尝试从函数调用的实参列表反向推导参数包的具体类型,默认会将Ts...推导为空包。
此时函数的有效形参列表只剩下1个U,编译器会拿第一个实参1.0推导U为double,剩下的3个实参没有对应形参,自然会报参数数量不匹配的错误。
显式指定模板参数的匹配规则
显式指定模板实参时,遵循从左到右的贪婪匹配规则:
- 所有显式给出的模板实参,会优先全部匹配给模板参数列表最前面的可变参数包
Ts... - 参数包匹配完成后,剩下的模板参数如果有默认实参则使用默认值,没有默认实参的会从函数实参列表推导。
对应你的两个测试用例:
- 调用
valid<double, int, int>(1.0, 1, 2, 3)时:3个显式指定的模板参数全部匹配给Ts...,即Ts = {double, int, int}。后续的U从实参列表推导,函数形参总长度为3+1=4,刚好匹配传入的4个实参,最后一个实参3推导U为int,因此编译正常。 - 调用
valid<double, int, int, int>(1.0, 1, 2, 3)时:4个显式指定的模板参数全部匹配给Ts...,即Ts = {double, int, int, int}。后续的U需要额外对应1个形参,函数形参总长度为4+1=5,你仅传入4个实参,因此报参数数量不匹配的错误。
内容的提问来源于stack exchange,提问作者HCSF
相关产品推荐
相关产品推荐

