Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否所有模板参数包都有;“空的”;作为其默认值?_C++_Templates_Standards - Fatal编程技术网

C++ 是否所有模板参数包都有;“空的”;作为其默认值?

C++ 是否所有模板参数包都有;“空的”;作为其默认值?,c++,templates,standards,C++,Templates,Standards,看看下面的代码,显然GCC和Clang都乐于接受它:[]: 模板 constexpr int f(T1,T2){ 返回sizeof…(P1)+sizeof…(P2)+sizeof…(P3); } int main(){ 静态(f(12,3.4)==0); } 为什么要编译?标准中是否有一条规则规定,当无法推断模板参数包时,将假定其为空?[temp.param]17.1/15打算根据以下示例使代码格式错误: //U既不能从参数类型列表中推导,也不能指定 模板无效f(){}//错误 但文本有点不

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

模板
constexpr int f(T1,T2){
返回sizeof…(P1)+sizeof…(P2)+sizeof…(P3);
}
int main(){
静态(f(12,3.4)==0);
}

为什么要编译?标准中是否有一条规则规定,当无法推断模板参数包时,将假定其为空?

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

//U既不能从参数类型列表中推导,也不能指定
模板无效f(){}//错误
但文本有点不清楚:

如果类模板、变量模板或别名模板的模板参数具有默认模板- 参数,每个后续模板参数应提供默认模板参数或为 模板参数包。如果是主类模板、主变量模板或 别名模板是一个模板参数包,它应该是最后一个模板参数。模板参数 功能模板包后面不得有其他模板参数,除非该模板 参数可以从功能模板的参数类型列表(11.3.5)中推断,也可以具有默认值 论点(17.9.2)。扣减指南模板(17.10)的模板参数,没有默认值 参数应可从扣除指南模板的参数类型列表中扣除

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

您还可以争辩说,将类型传递给这些包的不可能性包括:

如果出现以下情况,程序格式不正确,无需诊断: [...] 可变模板的每个有效专门化都需要一个空模板参数包


但这是一个严重的延伸。

是的,有,你想要一个报价吗?@路人是的,请,我一直试图找到它,但失败了,嗯,显然它只适用于拖尾包装。大错误。而且,发布的代码格式不正确,不需要诊断,因为您要求包是空的。修好它,或者如果你愿意,我可以发布一个尖刻的回答@雅克·阿达姆纳夫劳蒙特(避免了陷阱:)
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);
}
 // U can be neither deduced from the parameter-type-list nor specified
 template<class... T, class... U> void f() { } // error