C++ 模板参数部分包扩展的一些困惑
如果模板参数是在其可选标识符之前带有省略号的类型参数,或者是声明参数包([dcl.fct])的参数声明,则模板参数是模板参数包。作为参数声明且其类型包含一个或多个未展开的参数包的模板参数包是包展开。类似地,如果模板参数包是类型参数,且模板参数列表包含一个或多个未展开的参数包,则该模板参数包是包扩展。作为包扩展的模板参数包不得扩展同一模板参数列表中声明的参数包。[ 例如:C++ 模板参数部分包扩展的一些困惑,c++,c++17,language-lawyer,C++,C++17,Language Lawyer,如果模板参数是在其可选标识符之前带有省略号的类型参数,或者是声明参数包([dcl.fct])的参数声明,则模板参数是模板参数包。作为参数声明且其类型包含一个或多个未展开的参数包的模板参数包是包展开。类似地,如果模板参数包是类型参数,且模板参数列表包含一个或多个未展开的参数包,则该模板参数包是包扩展。作为包扩展的模板参数包不得扩展同一模板参数列表中声明的参数包。[ 例如: template class Tuple;//Types是一个模板类型参数包 //但不是一个包扩展 template stru
template class Tuple;//Types是一个模板类型参数包
//但不是一个包扩展
template struct multi_array;//Dims是非类型模板参数包
//但不是一个包扩展
模板结构值\u保持器{
template struct apply{};//值是非类型模板参数包
//和一个包扩展
};
模板结构静态_数组;//错误:值扩展模板类型参数
//在同一模板参数列表中打包T
- 结束示例 ]
关于整个段落,我有很多困惑。我将在下面列出我的困惑
参数声明
可以是T variable
或T…variable
,第一个是简单的参数声明,第二个是可以接受同一类型的多个参数的参数包T ,无论如何,它们只允许接受由T
指定的相同类型的参数。它是否表示类型参数?似乎只有类型参数包可以接受多个不同类型。或者其他任何类型?如何阅读此句子
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