假设需要部分地专门化一个模板类型,该模板类型需要一个类型的可变列表,例如,它的所有参数都是,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 ++?
答案 0 :(得分:4)
这是不正确的。 [temp.param] / P15:
作为包扩展的模板参数包不得扩展a 参数包在同一 template-parameter-list 中声明。
v
既是包装又是包装扩展,它扩展了t
,它在同一 template-parameter-list 中声明。