扣除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)
如果是这样的话,为什么要在第一时间允许这样的声明呢?