【问题标题】:Lambda pack capture with ellipsis on both sides - what is the meaning?Lambda 包捕获两边都有省略号 - 是什么意思?
【发布时间】:2019-08-03 07:18:48
【问题描述】:

P0780 ("Allow pack expansion in lambda init-capture"),已获准用于 C++20,允许通过在作为 lambda 捕获的一部分的包扩展之前放置省略号 (...) 来生成闭包数据成员包。

这很有用 - 例如 - 当通过移动捕获一个包时:

template <typename... Ts>
void foo(Ts... xs)
{
    bar([...xs = std::move(xs)]{ /* ... */ });
}

在玩弄这个功能时,我想出了这个神秘的结构:

template <typename... Ts>
void foo(Ts... xs)
{
    [...xs...]{}();
}

int main()
{
    foo(0, 1, 2);
}

live example on godbolt.org

g++ (trunk) 编译它,但老实说,我很难理解它的含义。这是什么意思?生成闭包将作为数据成员具有什么?

【问题讨论】:

    标签: c++ lambda variadic-templates c++20


    【解决方案1】:

    它应该是格式错误的。归档89686(...并且已经修复!)[expr.prim.lambda.capture] 中的语法是:

    捕获
    简单捕获 ...opt
    ...optinit-capture

    你可以或者有一个simple-capture(应该是xs...或者你可以有一个init-捕获(应该是...xs=xsinit-capture 需要有一个initializer)。你不能同时拥有两者。

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      相关资源
      最近更新 更多