如何解决关于包扩展实例化元素的问题
请考虑以下规则:
既不是sizeof ...表达式也不是fold-expression的包展开的实例化将产生列表E 1 ,E 2 ,... E N ,其中N是数据包扩展参数中的元素数。每个E i 都是通过实例化模式并将每个包扩展参数替换为其第i个元素而生成的。在实例化上下文中,此类元素的解释如下:
- 如果数据包是模板参数数据包,则元素是相应类型(类型或非类型)的模板参数,用于从模板参数中指定类型或值;否则,
- 如果数据包是函数参数数据包,则元素是一个id表达式,指定由声明该数据包的模式实例化而产生的函数参数。
请注意粗体字。该规则仅说明包扩展发生在template-parameter-list
中的情况,例如:
template<typename...T>
struct Enclose{
template<T...t> // pack expansion
struct content{
};
};
int main(){
Enclose<int,char>::content<1,'0'> d;
}
仅在这种情况下发生包扩展,其元素称为template parameter
。但是,通常来说,包扩展不仅可以在template-parameter-list
中发生,而且还可以在template-argument-list
和其他任何允许的情况下发生(在temp.variadic#4中列出)。在这些情况下,实例化的实体不是template parameter
。因此,作为在实例化包含 template parameter pack 的pack扩展的模式时描述这些元素是什么的一般规则,此段是否存在不涵盖其他情况的缺陷?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。