0

下面定义了一个可变参数的非类型嵌套类模板,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;
4

1 回答 1

2

不,因为Ts...是包扩展。

§14.5.3 [temp.variadic]

p4包扩展由一个模式和一个省略号组成,其实例化会在列表中产生零个或多个模式的实例化(如下所述)。模式的形式取决于扩展发生的上下文。包扩展可能发生在以下情况下:

  • [...]
  • 在作为包扩展 (14.1) 的模板参数包中:
    • 如果模板参数包是参数声明;模式是没有省略号的参数声明;
    • [...]

p6 包扩展的实例化 [...] 产生一个列表E 1 , E 2 , ..., E N,其中N是包扩展参数中的元素数。[...]

因此,您的两个示例都是格式错误的,因为DEF将完全采用<int, bool>.

于 2012-11-22T00:28:12.317 回答