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“除非模板参数可以从函数模板的参数类型列表中推导出来,或者有一个默认参数,否则函数模板的模板参数包后面不应跟有另一个模板参数。”因此,我认为这是合法的,除非
类型
仅出现在非推导的上下文中。