可以在参数包被C ++ 11个lambda表达式中隐含捕捉?(Can a parameter pac

2019-08-06 10:13发布

有谁知道,如果“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);

是否标准明确任何地方指出,这不应该被很好地形成?

Answer 1:

14.5.3 / 6:

一包扩展为不是的实例化sizeof...表达产生一个列表E1,E2,...,EN,其中N是在包膨胀参数元素的数量。 每个Ei的通过实例化图案和其第i个元素替换每个包扩展参数生成。 所有的EI成为封闭的列表元素。

不管你被允许明确捕获包(你可以使用[ts ...]扩张的一般规律将导致列表中的每个元素的捕捉。



Answer 2:

我想这是良好的,我还没有找到一个直接声明(措辞有时缺乏清晰度/插图某些情况下),但我想这可以推断:

§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是一个参数包标识符 。 这种短款具有描述的λ-捕获如何抱包扩展,这表明参数包可以,即使其目的不是他们被捕获被捕获的唯一的工作。

§5.1.2/ 12:

如果是显式隐式捕获的实体被捕获 。[...]

§3/ 3:

一个实体是一个值,对象,参考,功能,枚举,类型,类的成员,模板,模板特,命名空间参数包 ,或此。

从这我假设参数包是可以明确或含蓄地被捕获 ,因此,同样的拍摄规则对于普通的变量应适用,但参数包应相应扩大实体

我想你的问题(和相同的论证)可以为例如参考变量适用同样( 这是不确定的引用是否需要存储。§8.3.2/ 4 )。 看来,当你允许或不提及的参数组标识符拉姆达里面你有兴趣。

你可以想想参考变量相同外范围,因为你可以访问他们,但甚至不能被允许访问原始变量的标识符。

他们是作为参数包的空灵。



文章来源: Can a parameter pack be captured implicitly within C++11 lambdas?