C++ 模板参数部分包扩展的一些困惑

C++ 模板参数部分包扩展的一些困惑,c++,c++17,language-lawyer,C++,C++17,Language Lawyer,如果模板参数是在其可选标识符之前带有省略号的类型参数,或者是声明参数包([dcl.fct])的参数声明,则模板参数是模板参数包。作为参数声明且其类型包含一个或多个未展开的参数包的模板参数包是包展开。类似地,如果模板参数包是类型参数,且模板参数列表包含一个或多个未展开的参数包,则该模板参数包是包扩展。作为包扩展的模板参数包不得扩展同一模板参数列表中声明的参数包。[ 例如: template class Tuple;//Types是一个模板类型参数包 //但不是一个包扩展 template stru

如果模板参数是在其可选标识符之前带有省略号的类型参数,或者是声明参数包([dcl.fct])的参数声明,则模板参数是模板参数包。作为参数声明且其类型包含一个或多个未展开的参数包的模板参数包是包展开。类似地,如果模板参数包是类型参数,且模板参数列表包含一个或多个未展开的参数包,则该模板参数包是包扩展。作为包扩展的模板参数包不得扩展同一模板参数列表中声明的参数包。[ 例如:

template class Tuple;//Types是一个模板类型参数包
//但不是一个包扩展
template struct multi_array;//Dims是非类型模板参数包
//但不是一个包扩展
模板结构值\u保持器{
template struct apply{};//值是非类型模板参数包
//和一个包扩展
};
模板结构静态_数组;//错误:值扩展模板类型参数
//在同一模板参数列表中打包T
- 结束示例 ]

关于整个段落,我有很多困惑。我将在下面列出我的困惑

  • 参数声明的类型包含一个或多个未展开的参数包,它是包扩展

    关于这句话,一个参数声明怎么可能包含多个类型呢?
    参数声明
    可以是
    T variable
    T…variable
    ,第一个是简单的参数声明,第二个是可以接受同一类型的多个参数的参数包T ,无论如何,它们只允许接受由
    T
    指定的相同类型的参数。它是否表示类型参数?似乎只有类型参数包可以接受多个不同类型。或者其他任何类型?如何阅读此句子

  • 包含一个或多个未展开的参数包的模板参数列表为类型参数的模板参数包是包扩展

    这句话是指模板参数吗?似乎只有这种模板参数才能有模板参数列表,原因是:

  • 模板<模板参数列表>类型参数键…opt标识符opt

  • 根据整段,我仍然不明白为什么
    Dims
    不是一个包扩展,但是
    Values
    是,根据这段,什么可以是包扩展?似乎没有任何暗示它将是像
    某物…
    这样的形式,或者我在这句话中遗漏了这一点
  • 如果我有任何误解,请纠正我

    一个参数声明怎么可能包含多个类型?一个参数声明可以是
    T variable
    T…variable
    这样的形式,第一个是简单的参数声明,第二个是参数包,可以接受同一类型的多个参数
    T
    ,不管怎样,它们都是只允许的接受由
    T
    指定的相同类型的参数

    您缺少
    T
    是参数包的情况。示例列出了以下内容

    template<class... T> struct value_holder {
      template<T... Values> struct apply { };             // Values is a non-type template parameter pack
                                                          // and a pack expansion
    };
    

    FWW,这个标准不是用来学习C++的资源,这是可以理解的:@ IDCLV463035818 OOPS,谢谢。这确实是C++学习的另一种方法。Howerver,在这个问题上,标签是“代码>语言律师< /代码>,我只想在读到这个之后用困惑来讨论这个句子。抱歉,我不想暗示问题不好。最终重要的是标准中写的内容,而不是参考文献中的内容(尽管cppref是完全同步的)@idclev463035818没关系。引用的是c++17标准,我不确定这是我的误解还是标准中的缺陷,所以,我在这里发布了一个问题,让语言律师大师告诉我答案。对于第一个问题,我相当肯定你刚才重申了OP的内容。我认为OP实际上是在问“一个参数声明怎么可能有多个参数包?”我认为标准所指的是类似于
    template struct holder{template apply{};};
    (是
    std::pair
    甚至是一个文本类型?不记得了。你明白了。),其中一个模板参数声明(
    std::pair…value
    )包含多个参数包。@Caleth回答得很好。但是我必须说,T不是类型参数包吗?至少它不是一个参数声明。如果我没有误解,
    int…Dims
    这是一个参数声明,也是一个参数包。@jackX区别在于
    value\u holder::apply中的
    T
    命名一个参数包,而
    multi_array
    中的
    int
    不命名。
    int…Dims
    只定义一个包。
    t…Values
    都定义
    Values
    并展开
    t
    @Caleth谢谢,它只是解释什么是包展开,例如
    t…
    ,但是,如何解释f第一个问题?我仍然认为
    T
    是一个类型参数,而不是
    模板结构应用
    中的
    参数声明
    @jackX,
    T
    不是一个类型参数。它是
    模板结构值
    template<class... T> struct value_holder {
      template<T... Values> struct apply { };             // Values is a non-type template parameter pack
                                                          // and a pack expansion
    };
    
    template<class... T, T... Values> struct static_array;// error: Values expands template type parameter
                                                          // pack T within the same template parameter list