相关疑难解决方法(0)

函数参数包的模板参数推导后跟其他参数

扣除f1f2形成不良?

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.call]

当函数参数包出现在非推导的上下文([temp.deduct.type])中时,永远不会推导出该参数包的类型.

[temp.deduct.type] P5

未推断的上下文是:

  • 函数参数包,不会出现在参数声明列表的末尾.

所以似乎MSVC拒绝两者都是正确的?

这是否意味着即使您明确指定模板args,模板的任何实例化都将是格式错误的?

f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?
Run Code Online (Sandbox Code Playgroud)

如果是这样的话,为什么要在第一时间允许这样的声明呢?

c++ variadic-templates c++11 template-argument-deduction

7
推荐指数
1
解决办法
327
查看次数