Jam*_*ree 7 c++ variadic-templates c++11 template-argument-deduction
扣除f1和f2形成不良?
template<class... T, class U>
void f1(T..., U){}
template<class... T>
void f2(T..., int){}
int main()
{
f1(1);
f2(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
g ++接受两者,clang只接受f2,而msvc拒绝这两者.
相关标准措辞:
当函数参数包出现在非推导的上下文([temp.deduct.type])中时,永远不会推导出该参数包的类型.
未推断的上下文是:
- 函数参数包,不会出现在参数声明列表的末尾.
所以似乎MSVC拒绝两者都是正确的?
这是否意味着即使您明确指定模板args,模板的任何实例化都将是格式错误的?
f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?
Run Code Online (Sandbox Code Playgroud)
如果是这样的话,为什么要在第一时间允许这样的声明呢?
针对此特定问题有一个 DR DR1388。显然,GCC 和 CLANG 似乎还没有实现CLANG DR1388。
这是否意味着即使您显式指定模板参数,模板的任何实例化都将是格式错误的?
Run Code Online (Sandbox Code Playgroud)f1<int>(1, 2); // ill-formed? f2<int>(1, 2); // ill-formed?如果是这样的话,为什么首先允许这样的声明呢?
否,如果您显式指定模板参数,则不会发生推导,因此上面显示的代码是合法的。