以下定义了一个可变的非类型嵌套类模板DEF
。根据为Ts
提供的类型参数,非类型模板参数可能是异构的。
template <typename ...Ts>
struct ABC {
template <Ts ...Xs>
struct DEF {};
};
DEF
对象可以声明如下:
ABC<int,bool>::DEF<17,true> x;
我的问题是,提供给DEF
的非类型模板参数的数量是否可以少于提供给ABC
的类型模板参数的数量?例如,这些声明中的任何一个都是有效的:
ABC<int,bool>::DEF<17> y;
ABC<int,bool>::DEF< > z;
答案 0 :(得分:2)
不,因为Ts...
是包扩展。
§14.5.3 [temp.variadic]
p4 包扩展由模式和省略号组成,其实例化在列表中生成零个或多个模式的实例化(如下所述)。模式的形式取决于扩展发生的环境。包扩展可以在以下上下文中发生:
- [...]
- 在作为包扩展的模板参数包(14.1)中:
- 如果模板参数包是参数声明;模式是没有省略号的参数声明;
- [...]
p6包扩展[...]的实例化生成一个列表 E 1 ,E 2 ,...,E N ,其中
N
是包扩展参数中的元素数。 [...]
因此,您的示例都会格式不正确,因为DEF
将完全采用<int, bool>
。