gpt4 book ai didi

c++ - 关于 [temp.variadic] 中包扩展的实例化的措辞

转载 作者:行者123 更新时间:2023-12-01 14:07:36 24 4
gpt4 key购买 nike

我想知道以下引用中的措辞是否有误,即
temp.variadic#7

The instantiation of a pack expansion that is neither a sizeof... expression nor a fold-expression produces a list E1,E2,...En, where N is the number of elements in the pack expansion parameters. Each Ei is generated by instantiating the pattern and replacing each pack expansion parameter with its ith element. Such an element, in the context of the instantiation, is interpreted as follows:

  • if the pack is a template parameter pack, the element is a template parameter of the corresponding kind (type or non-type) designating the type or value from the template argument; otherwise,
  • if the pack is a function parameter pack, the element is an id-expression designating the function parameter that resulted from the instantiation of the pattern where the pack is declared.


函数参数包的模式是一个没有省略号的参数声明,因为它定义如下:
temp.variadic#4

A pack expansion consists of a pattern and an ellipsis, the instantiation of which produces zero or more instantiations of the pattern in a list (described below). The form of the pattern depends on the context in which the expansion occurs. Pack expansions can occur in the following contexts:

  • [...]
  • In a function parameter pack ([dcl.fct]); the pattern is the parameter-declaration without the ellipsis.


通常的参数声明包括:
  • 属性说明符序列 (opt) 声明说明符序列声明符
  • 属性说明符序列 (opt) 声明说明符序列声明符 = 初始化子句
  • 属性说明符-seq (opt) 声明说明符-seq 抽象声明符(opt)
  • 属性说明符序列 (opt) 声明说明符序列抽象声明符 (opt) = 初始化子句

  • 无论如何, decl-specifier-seq不是可选组件。
    在这个例子中
    template<typename...T>
    void func(T...args){
    }
    T...args是一个函数参数包,其中, T args是它的模式。所以我的问题是,为什么从函数参数包的模式实例化生成的元素是 id-expression , 然而 id-expression只是参数声明的声明符的一部分。

    最佳答案

    我试着回答这个问题,要理解这些句子,这些句子需要拆分成几个部分。

    1. A function parameter pack is a function parameter that accepts zero or more function arguments.

    什么是函数参数包?
    在 c++17 标准中,它说:
    dcl.fct#16

    A declarator-id or abstract-declarator containing an ellipsis shall only be used in a parameter-declaration. Such a parameter-declaration is a parameter pack. When it is part of a parameter-declaration-clause, the parameter pack is a function parameter pack.


    这听起来像是一个参数声明,其中 declarator-id 或 abstract-declarator 包含一个省略号,这样的参数声明出现在参数声明子句中,这样的参数声明是一个函数参数包。对?
    现在,我们看看最新的草案是怎么说的:
    dcl.fct#21

    A declarator-id or abstract-declarator containing an ellipsis shall only be used in a parameter-declaration. When it is part of a parameter-declaration-clause, the parameter-declaration declares a function parameter pack.


    它说的是一个参数声明,其中 declarator-id 或abstract-declarator 包含一个省略号,这样的参数声明出现在参数声明子句中,就这里而言,它们是相同的,但是,不同之处在于,这样的参数-声明 声明一个函数参数包 .意思是 T...args声明一个函数参数包。
    1. A pack expansion consists of a pattern and an ellipsis, the instantiation of which produces zero or more instantiations of the pattern in a list... Pack expansions can occur in the following contexts:
    • In a function parameter pack ([dcl.fct]); the pattern is the parameter-declaration without the ellipsis.


    这句话的意思是在一个上下文中发生了一个包扩展,它是一个函数参数包,模式是没有省略号的参数声明。非正式地,对于这种情况 T...args , 其中 T...表示包扩展和 T...args 的模式是 T args .

    The instantiation of a pack expansion...

    1. if the pack is a function parameter pack, the element is an id-expression designating the function parameter that resulted from the instantiation of the pattern where the pack is declared.


    关于第三个项目符号,此包不表示 T ,它是由参数声明声明的东西,作为第一个项目符号的分析。理解这句话的另一个要点是 由声明包的模式实例化产生的函数参数 , 如前所述,模式是 T args包被声明的地方。所以,强调句的意思是 function parameter是模式 T args 的这些实例化的结果包装扩展 T...args , 现在它确认了第二个项目符号,对于某些情况,例如 postfix-expression(args...) , 包 args曾经是这种包扩展的一种模式,这种包扩展的实例化将是 id-expression指定来自模式实例化的函数参数 T args .

    关于c++ - 关于 [temp.variadic] 中包扩展的实例化的措辞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62630486/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com