C++ 显式指定位于模板参数包之后的默认模板参数

C++ 显式指定位于模板参数包之后的默认模板参数,c++,templates,variadic-templates,C++,Templates,Variadic Templates,为什么我不能在以下情况下显式指定d #include <iostream> template< typename a, typename b = int, typename ...c, typename d = int > int f(a, b, c..., d) { return sizeof...(c); } int main() { std::cout << f< int, int, int, int/*, char*/ >

为什么我不能在以下情况下显式指定
d

#include <iostream>

template< typename a, typename b = int, typename ...c, typename d = int >
int
f(a, b, c..., d)
{
    return sizeof...(c);
}

int
main()
{
    std::cout << f< int, int, int, int/*, char*/ >(1, 2, 3, 4, 'd') << std::endl;
    return 0;
}

在这种情况下,拒绝它的规则是什么?

因为包是贪婪的。因此
char
实际上是
c
的一部分,您需要提供与
d
相关的参数,由于默认情况,该参数的类型为
int

,因为包是贪婪的。因此,
char
实际上是
c
的一部分,您需要提供与
d
相关的参数,由于默认设置,该参数的类型为
int

@DieterLücking我也怀疑这一点,但是,处理模板参数包和默认参数的规则集是什么呢?变量包在末尾出现的另一个原因。@101010理论上,编译器可以计算函数的参数量并推断出
x=5-1-1-1==2
,但实际上并没有这样做。因为您的问题已经或多或少得到了回答,我想补充一点,使用
std::tuple
是您尝试执行的一种变通方法:
intf(a,b,std::tuple,d)
@和yg-我认为这并不能解决问题。如果使用扣减,则可以正确推断包装。不过,现在的情况是Orient正在尝试指定模板参数,并且在该上下文中,
c
将耗尽提供的所有参数。例如,我对你的演示做了一点修改,把问题找回来:@DieterLücking我也怀疑这一点,但是,处理模板参数包和默认参数的规则集是什么呢?变量包在末尾出现的另一个原因。@101010理论上,编译器可以计算函数的参数量并推断出
x=5-1-1-1==2
,但实际上并没有这样做。因为您的问题已经或多或少得到了回答,我想补充一点,使用
std::tuple
是您尝试执行的一种变通方法:
intf(a,b,std::tuple,d)
@和yg-我认为这并不能解决问题。如果使用扣减,则可以正确推断包装。不过,现在的情况是Orient正在尝试指定模板参数,并且在该上下文中,
c
将耗尽提供的所有参数。例如,我对你的演示做了一点修改,把问题解决了:因此
templatevoid f(a…,T){return;}
是完全错误的构造,但语言规则允许,不是吗?因此
templatevoid f(a…,T){return;}
是完全错误的构造,但是语言规则允许,不是吗?
main.cpp:14:18: error: no matching function for call to 'f'
    std::cout << f< int, int, int, int, char >(1, 2, 3, 4, 'd') << std::endl;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:1: note: candidate function not viable: requires 6 arguments, but 5 were provided
f(a, b, c..., d)
^
1 error generated.