可以在c++ 11 lambda中隐式捕获参数包吗?

Can a parameter pack be captured implicitly within C++11 lambdas?

本文关键字:参数 包吗 c++ lambda      更新时间:2023-10-16

有谁知道下面对'ts'的隐式捕获是否格式良好吗?

template<class ... Ts> void bar(Ts ... ts) { }
template<class ... Ts> int foo(Ts ... ts) {
    auto L = [=] () {
       bar(ts...);
    };
    L();
    return 0;
}
int g = foo(1, 2, 3);

标准是否在任何地方明确指出这不应该是良好的格式?

14.5.3/6:

sizeof...表达式的包扩展实例化产生列表E1, E2,…, EN, whereN是包扩展参数中元素的个数。每个Ei都是通过实例化模式并将每个包扩展参数替换为其with元素来生成的。所有Ei都成为封闭列表中的元素。

无论您是否被允许显式捕获包(您可以使用[ts ...]),扩展的一般规则将导致捕获列表的每个元素。

我猜它的格式很好,我没有发现一个直接的陈述(措辞有时缺乏清晰度/说明某些情况),但我猜它可能是推断出来的:

§5.1.2/23:

捕获后跟一个省略号的是一个包展开(14.5.3)。(例子:

      template<class... Args>
      void f(Args... args) {
        auto lm = [&, args...] { return g(args...); };
        lm();
      }

- end示例]

  • 捕获后跟一个省略号,意味着args,在lambda捕获中,是捕获的一个例子(在这种情况下,显式的),值得注意的事实是args是一个参数包标识符。这个简短的段落的唯一工作是描述lambda-capture 保持包扩展,它演示了参数包可以被捕获,即使它的目的不是关于允许被捕获

§5.1.2/12:

如果被显式或隐式捕获,则实体被捕获。[…]

§3/3:

实体是值、对象、引用、函数、枚举数、类型、类成员、模板、模板特化、命名空间、参数包或this。

由此我假设参数包是可以显式或隐式捕获的实体,因此,与普通变量相同的捕获规则将适用,除了参数包应相应地扩展。

我猜你的问题(和相同的论证)可以同样适用于引用变量,例如(它是未指定的引用是否需要存储。§8.3.2/4)。当允许或不允许在lambda中引用参数包标识符时,您似乎感兴趣。

对于外部作用域中的引用变量也可以这样考虑,因为您可以访问它们,但甚至不允许访问原始变量的标识符。

它们和参数包一样虚无缥缈