【发布时间】:2020-06-29 02:48:06
【问题描述】:
我想知道下面引用中的措辞是否有误,即
既不是 sizeof... 表达式也不是折叠表达式的包展开的实例化生成一个列表 E1,E2,...En ,其中 N 是包扩展参数中的元素数。每个 Ei 都是通过实例化模式 并用其第 i 个元素替换每个包扩展参数来生成的。这样的元素,在实例化的上下文中,解释如下:
- 如果包是模板参数包,则元素是相应类型(类型或非类型)的模板参数,指定模板参数的类型或值;否则,
- 如果包是函数参数包,则元素是一个id-expression,用于指定函数参数,该函数参数由声明包的模式的实例化产生。
函数参数包的模式是没有省略号的参数声明,因为它的定义如下:
temp.variadic#4
包扩展由一个模式和一个省略号组成,其实例化会在列表中产生零个或多个模式的实例化(如下所述)。模式的形式取决于扩展发生的上下文。包扩展可能发生在以下情况:
- [...]
- 在函数参数包中([dcl.fct]);模式是没有省略号的参数声明。
通常的参数声明包括:
- attribute-specifier-seq (opt) decl-specifier-seq 声明符
- attribute-specifier-seq (opt) decl-specifier-seq declarator = initializer-clause
- attribute-specifier-seq (opt) decl-specifier-seq abstract-declarator(opt)
- attribute-specifier-seq (opt) decl-specifier-seq abstract-declarator (opt) = initializer-clause
无论如何,decl-specifier-seq 不是可选组件。
在这个例子中
template<typename...T>
void func(T...args){
}
T...args是一个函数参数包,其中T args是它的模式。所以我的问题是,为什么从函数参数包的模式实例化生成的元素是id-expression,但是id-expression只是参数声明的声明符的一部分。
【问题讨论】:
标签: c++ c++17 language-lawyer