部分模板特化取决于混合类型的可变积分常量常量

时间:2015-08-12 00:17:43

标签: c++ templates c++11

假设需要部分地专门化一个模板类型,该模板类型需要一个类型的可变列表,例如,它的所有参数都是,std::integral_constant的特化。

以下简单的方法被各种版本的clang和GCC接受,但被VS 14(2015)拒绝,但错误:

  

错误C3522:' t':参数包在此上下文中无法展开

template<typename...>
struct foo;

template<typename... t, t... v>
struct foo<std::integral_constant<t, v>...>
{
    /* ... */
};

foo<std::integral_constant<int, -1>, std::true_type> bar; 

我似乎无法在C ++标准草案(n4296)中找到任何允许或禁止此类模式匹配的内容,所以在我提交针对VS 14的错误报告之前,我最好咨询大师在那里:

以上示例是否真的有效C ++?

1 个答案:

答案 0 :(得分:4)

这是不正确的。 [temp.param] / P15:

  

作为包扩展的模板参数包不得扩展a   参数包在同一 template-parameter-list 中声明。

v既是包装又是包装扩展,它扩展了t,它在同一 template-parameter-list 中声明。