14.5.3 [temp.variadic],第5段
为了确定参数包是否满足关于参数包以外的实体的规则,参数包被认为是实例的实体,该实体将出现在其中的模式。 [实施例:
template<class ... Types> void f(Types ... rest); template<class ... Types> void g(Types ... rest) { f(&rest ...); // “&rest ...” is a pack expansion; “&rest” is its pattern }
-end example]
委员会将实体的标题赋予参数包,以便lambda表达式可以找到它的标识符而无需显式捕获它 - 请参阅this。话虽这么说,我希望看到一个与lambda表达式相关的东西,使用参数包,但实际的远远不是我的期望。我不知道上面的例子是如何与措辞相关的(我认为它应该是关于名字查找或其他东西)。此外,“实体”旁边的粗体文字的目的是什么(我几乎不明白这意味着什么......)?
答案 0 :(得分:2)
我认为这是标准中的[次要]编辑问题(我提交了一个关于它的问题)。有问题的文本是核心问题1662的结果,建议在第4段末尾添加该文本,在这种情况下,整个文本将为:
包扩展由模式和省略号组成,其实例化产生零或更多 列表中模式的实例化(如下所述)。模式的形式取决于上下文 哪个扩张发生。包扩展可以在以下情况下发生:
- 在功能参数包[...]中 - 在模板参数包[...]中 [...]
- 在 fold-expression [...]中 为了确定参数包是否满足关于除了以外的实体的规则 参数包,参数包被认为是实例化产生的实体 它出现的模式。 [例如:template<class ... Types> void f(Types ... rest); template<class ... Types> void g(Types ... rest) { f(&rest ...); // “&rest ...” is a pack expansion; “&rest” is its pattern }
-end example]
这里的例子只是一个包扩展的例子 - 这是前一段中介绍的术语。 “为了......的目的”这一部分已经成为它自己的段落,而不是第4段的扩展,这使得该例子的位置非常奇怪。
尽管如此,示例并不是规范性的,重要的是文本。
答案 1 :(得分:1)
标准试图在这里说的是某些规则不适用于参数包,但是适用于解包所述包的结果。
E.g。要确定给定的lambda捕获是否是 simple-capture ,您无法检查该包是否具有自动存储持续时间。包没有存储时间。相反,解压缩包,然后为每个解压缩的结果确定是否具有自动存储持续时间。