C++ 是否所有模板参数包都有;“空的”;作为其默认值?
看看下面的代码,显然GCC和Clang都乐于接受它:[]: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(){}//错误 但文本有点不
模板
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