我想这是良好的,我还没有找到一个直接声明(措辞有时清晰度/插图某些情况下没有),但我想这可以推断:
§5.1.2/ 23 :
A捕获随后省略号是一包扩展(14.5.3)。 [实施例:
template<class... Args>
void f(Args... args) {
auto lm = [&, args...] { return g(args...); };
lm();
}
- 端示例]
- A捕获后跟省略,意味着
args
,在λ-捕获,是一个例子一个捕获(在这种情况下,明确的),并且值得注意的事实是args
是一个参数包标识符。这个短小段落描述lambda-captures如何保持包扩展,这表明参数包可以被捕获,即使其目的不是约允许他们被捕获。
§5.1.2/ 12:
的实体被捕获如果它被捕获明确或隐含 [...]
§3/ 3:
一种实体是值,对象,参考,功能,枚举,类型,类的成员,模板,模板特,命名空间,参数包,或这。
从这我假设参数包是可以明确或隐含被捕获,因此,同样的拍摄规则对于普通的变量应适用,但参数包应相应扩大实体。
我想你的问题(和相同的论证)同样适用于例如参考变量(It is unspecified whether or not a reference requires storage. §8.3.2/4)。当你允许或不参考参数包标识符时,你似乎对你感兴趣。
您可以认为外部作用域中的引用变量相同,因为您可能有权访问它们,但甚至不能访问原始变量的标识符。
它们与参数包相同。
我知道你可以明确地捕获它们,但是我还没有看到任何“无论你明确捕获,你都可以隐式捕获,反之亦然”的效果。 – chris
如果它形成良好,我相信它会导致无限递归。 :-)我不确定这个标准是怎么说的。我认为这是未定义的行为。 ;-)如果是这样,那就意味着解析该代码可以得到任何结果,即使lambda中的包装表达式格式良好。 :-) – Omnifarious
谢谢omnifarious - 我修复了无限递归问题。 –