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

文森特

标准是否完美定义了以下内容?

#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但是我不知道这是否正常。

萨尔瓦托·阿万佐(Salvatore Avanzo)

根据ISO C ++标准的当前工作草案14.1(11):

除非可以从功能模板的parameter-type-list推导该模板参数或具有默认参数,否则功能模板的模板参数包后不得再跟随另一个模板>参数。

在您的情况下,'Types'是功能参数包,而'Values'即模板参数包,可以始终跟在功能参数包后面同样,此代码也基于相同的原因起作用:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章