混合可变参数模板值和可变参数推导类型

Mixing variadic template values and variadic deduced types

本文关键字:变参 参数 类型 混合      更新时间:2023-10-16

以下标准是否完美定义?

#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;
}

它在g++ 4.8下编译得很好,但我想知道它是否正常。

根据 ISO C++ 标准当前的工作草案 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;
}