gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:38:59 25 4
gpt4 key购买 nike

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;
}

g++ 两者都接受,clang 只接受f2,msvc 两者都拒绝。

相关标准写法:

[temp.deduct.call]

When a function parameter pack appears in a non-deduced context ([temp.deduct.type]), the type of that parameter pack is never deduced.

[temp.deduct.type]p5

The non-deduced contexts are:

  • A function parameter pack that does not occur at the end of the parameter-declaration-list.

那么 MSVC 拒绝两者似乎是正确的?

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

f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?

如果是这样,为什么一开始就允许这样的声明?

最佳答案

此特定问题有一个 DR DR1388 .显然,GCC 和 CLANG 似乎还没有实现它 CLANG DR1388 .

Does it mean that any instantiation of the templates will be ill-formed, even if you specify the template args explicitly?

f1<int>(1, 2); // ill-formed?
f2<int>(1, 2); // ill-formed?

If that's the case, why allow such declarations at first place?

否,如果您明确指定模板参数,则不会发生推导,因此上面显示的代码是合法的。

关于c++ - 函数参数包后跟其他参数的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36640883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com