gpt4 book ai didi

c++ - 所有模板参数包的默认值都是 "empty"吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:19 25 4
gpt4 key购买 nike

看看下面的代码,显然 GCC 和 Clang 都乐于接受:[ coliru ]:

template <class ... P1, class T1, class ... P2, class T2, class ... P3>
constexpr int f(T1, T2) {
return sizeof...(P1) + sizeof...(P2) + sizeof...(P3);
}
int main() {
static_assert(f(12, 3.4) == 0);
}

为什么要编译?标准中有没有规定,当模板参数包无法推导出来时,就假定为空?

最佳答案

[temp.param] 17.1/15 打算根据示例使您的代码格式错误:

 // U can be neither deduced from the parameter-type-list nor specified
template<class... T, class... U> void f() { } // error

但是文字有点不清楚:

If a template-parameter of a class template, variable template, or alias template has a default template- argument, each subsequent template-parameter shall either have a default template-argument supplied or be a template parameter pack. If a template-parameter of a primary class template, primary variable template, or alias template is a template parameter pack, it shall be the last template-parameter. A template parameter pack of a function template shall not be followed by another template parameter unless that template parameter can be deduced from the parameter-type-list (11.3.5) of the function template or has a default argument (17.9.2). A template parameter of a deduction guide template (17.10) that does not have a default argument shall be deducible from the parameter-type-list of the deduction guide template.

问题是模板参数包不是模板参数;虽然 T..., U... 被禁止用于模板类,但阻止它进入模板函数的措辞似乎有点错误。

您还可以争辩说,将类型传递给这些包的可能性与以下因素有关:

The program is ill-formed, no diagnostic required, if: [...] every valid specialization of a variadic template requires an empty template parameter pack,

但这是一个严重的延伸。

关于c++ - 所有模板参数包的默认值都是 "empty"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53357424/

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