C++ 混合可变模板值和可变推断类型
标准是否完美定义了以下各项C++ 混合可变模板值和可变推断类型,c++,c++11,templates,variadic-templates,template-argument-deduction,C++,C++11,Templates,Variadic Templates,Template Argument Deduction,标准是否完美定义了以下各项 #include <iostream> template <unsigned int... Values, class... Types> void f(Types&&... values) { std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl; } int main() { f<
#include <iostream>
template <unsigned int... Values, class... Types>
void f(Types&&... values)
{
std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}
int main()
{
f<7, 5>(3);
return 0;
}
#包括
模板
无效f(类型和值)
{
std::从14.1(11)中可以
函数模板的模板参数包后面不得跟有另一个模板>参数,除非该模板参数可以从>函数模板的参数类型列表中推导出来,或者具有默认参数
在您的情况下,“类型”是一个函数参数包,“值”是一个模板参数包,后面总是可以跟一个函数参数包。
此外,该代码的工作原理与此相同:
#include <iostream>
template <class... Values, class... Types>
void f(Types&&... values)
{
std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}
int main()
{
f<int, float>(-3, 5);
return 0;
}
#包括
模板
无效f(类型和值)
{
std::coutWell我不擅长使用标准段落,但为什么你不希望这样做呢?积分是有效的模板参数值,从参数中进行类型推断也有很长一段时间。因为你的类型
是从你的函数参数中推导出来的,而你的值
是指定的由于5
绝对不是一种类型,我很难看到它的编译方式与您指定的(和预期的)不完全一致。您认为什么可能是不符合标准的问题?[temp.param]/11“除非模板参数可以从函数模板的参数类型列表中推导出来,或者有一个默认参数,否则函数模板的模板参数包后面不应跟有另一个模板参数。”因此,我认为这是合法的,除非类型
仅出现在非推导的上下文中。