我想知道在下面的引语中,这是否是一个错误的措辞?
一个既不太大的包膨胀的实例化..。表达式或折叠表达式都会生成list E1、E2、...En,其中N是pack展开参数中的元素数。每个Ei是通过实例化模式并用其ith元素替换每个包展开参数来生成的。在实例化的上下文中,这样一个元素被解释为:
函数参数包的模式是没有省略号的参数声明,因为它定义如下:
包展开由模式和省略号组成,其实例化在列表中生成模式的零或多个实例化(如下所述)。模式的形式取决于展开发生的上下文。可以在以下上下文中展开Pack:
通常的参数声明包括:
无论如何,decl-specifier-seq不是一个可选组件。
在这个例子中
template<typename...T>
void func(T...args){
}T...args是一个函数参数包,它的模式是T args。因此,我的问题是,为什么函数参数包的模式实例化生成的元素是id-expression,而id-expression只是参数声明声明器的一部分。
发布于 2020-06-29 07:26:12
我试着回答这个问题,为了理解这些句子,这些句子被分成几个部分。
什么是函数参数包?
在c++17标准中,它说:
包含省略号的声明符id或抽象声明符只能用于参数声明.这样的参数声明是一个参数包。当参数包是参数声明子句的一部分时,参数包就是函数参数包。
这听起来像是一个参数声明,其中声明者id或抽象声明者包含一个省略号,这样的参数声明出现在参数声明子句中,这样的参数声明是一个函数参数包。对吗?
现在,我们看到最新的草案是怎么说的:
包含省略号的声明符id或抽象声明符只能用于参数声明.当参数声明-子句的一部分时,参数声明声明函数参数包。
它表示一个参数声明,其中声明符id或抽象声明器包含一个省略号,这样的参数声明出现在参数-声明-子句中,就这里而言,它们是相同的,但是,这里的区别是,这样的参数声明声明了一个函数参数包。这意味着T...args声明了一个函数参数包。
这个句子意味着在一个函数参数包的上下文中发生了一个包扩展,这个模式是没有省略号的参数声明。非正式地说,对于本例中的T...args,它的T...表示一个包的扩展,而T...args的模式是T args。
包膨胀的实例化..。
关于第三个项目,这个包并不表示T,它是一个参数声明声明的东西,作为对第一个项目的分析。理解这句话的另一个重要点是函数参数,它是通过实例化包被声明为的模式产生的,正如前面提到的,模式是声明包的T args。因此,强调句表示function parameter是pack展开T...args模式T args的这些实例化的结果,现在它确认了第二个符号,对于postfix-expression(args...)这样的例子,pack args被用作这种包扩展的模式,而这种pack展开的实例化将是id-expression指定来自于模式T args实例化的函数参数。
发布于 2020-06-29 04:19:46
在该包展开中,T 和 args被展开(即使后者被声明为pack);因此,由此产生的_参数-声明_s具有表单T1 args1,T2 args2,…,并且适当地配备了decl-specifier。
https://stackoverflow.com/questions/62630486
复制相似问题