首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[temp.variadic]中关于包展开实例化的措辞

[temp.variadic]中关于包展开实例化的措辞
EN

Stack Overflow用户
提问于 2020-06-29 02:48:06
回答 2查看 87关注 0票数 4

我想知道在下面的引语中,这是否是一个错误的措辞?

temp.variadic#7

一个既不太大的包膨胀的实例化..。表达式或折叠表达式都会生成list E1、E2、...En,其中N是pack展开参数中的元素数。每个Ei是通过实例化模式并用其ith元素替换每个包展开参数来生成的。在实例化的上下文中,这样一个元素被解释为:

  • 如果包是模板参数包,则元素是相应类型(类型或非类型)的模板参数,指示模板参数中的类型或值;否则,
  • 如果pack是一个函数参数包,则元素是一个id-expression,它指定由声明包的模式的实例化产生的函数参数。

函数参数包的模式是没有省略号的参数声明,因为它定义如下:

temp.variadic#4

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

  • ..。
  • 在函数参数包(dcl.fct)中,模式是没有省略号的dcl.fct。

通常的参数声明包括:

  • 属性-说明符-seq (opt) decl-说明符-seq声明器
  • 属性-说明符-seq (opt) decl-说明符-seq声明符=初始化器-子句
  • 属性-说明符-seq (opt) decl-说明符-seq抽象-声明器(Opt)
  • 属性-说明符-seq (opt) decl-说明符-seq抽象-声明符(opt) =初始化器-子句

无论如何,decl-specifier-seq不是一个可选组件。

在这个例子中

代码语言:javascript
复制
template<typename...T>
void func(T...args){
}

T...args是一个函数参数包,它的模式是T args。因此,我的问题是,为什么函数参数包的模式实例化生成的元素是id-expression,而id-expression只是参数声明声明器的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-29 07:26:12

我试着回答这个问题,为了理解这些句子,这些句子被分成几个部分。

  1. 函数参数pack是接受零或多个函数参数的函数参数。

什么是函数参数包?

在c++17标准中,它说:

dcl.fct#16

包含省略号的声明符id或抽象声明符只能用于参数声明.这样的参数声明是一个参数包。当参数包是参数声明子句的一部分时,参数包就是函数参数包。

这听起来像是一个参数声明,其中声明者id或抽象声明者包含一个省略号,这样的参数声明出现在参数声明子句中,这样的参数声明是一个函数参数包。对吗?

现在,我们看到最新的草案是怎么说的:

dcl.fct#21

包含省略号的声明符id或抽象声明符只能用于参数声明.当参数声明-子句的一部分时,参数声明声明函数参数包。

它表示一个参数声明,其中声明符id或抽象声明器包含一个省略号,这样的参数声明出现在参数-声明-子句中,就这里而言,它们是相同的,但是,这里的区别是,这样的参数声明声明了一个函数参数包。这意味着T...args声明了一个函数参数包。

  1. 包展开由模式和省略号组成,其实例化将生成列表中模式的零或多个实例化。包扩展可以在以下上下文中发生
  • 函数参数pack (dcl.fct)中的dcl.fct;该模式是没有省略号的参数声明。

这个句子意味着在一个函数参数包的上下文中发生了一个包扩展,这个模式是没有省略号的参数声明。非正式地说,对于本例中的T...args,它的T...表示一个包的扩展,而T...args的模式是T args

包膨胀的实例化..。

  1. 如果这个包是一个函数参数包,元素是一个id表达式,它指定了产生的函数参数--这个模式被声明为

关于第三个项目,这个包并不表示T,它是一个参数声明声明的东西,作为对第一个项目的分析。理解这句话的另一个重要点是函数参数,它是通过实例化包被声明为的模式产生的,正如前面提到的,模式是声明包的T args。因此,强调句表示function parameter是pack展开T...args模式T args的这些实例化的结果,现在它确认了第二个符号,对于postfix-expression(args...)这样的例子,pack args被用作这种包扩展的模式,而这种pack展开的实例化将是id-expression指定来自于模式T args实例化的函数参数。

票数 1
EN

Stack Overflow用户

发布于 2020-06-29 04:19:46

在该包展开中,T args被展开(即使后者被声明为pack);因此,由此产生的_参数-声明_s具有表单T1 args1,T2 args2,…,并且适当地配备了decl-specifier

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62630486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档