两边都带有省略号的 Lambda 包捕获 - 这是什么意思?

Lambda pack capture with ellipsis on both sides - what is the meaning?

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) 编译它,但老实说我很难理解它的含义。这是什么意思? generate 闭包的数据成员是什么?

它应该是错误的。归档 89686 (... and already fixed!) The grammar in [expr.prim.lambda.capture] 是:

capture:
    simple-capture ...opt
    ...opt init-capture

您可以简单捕获(即xs... 你可以有一个 init-capture (这将是 ...xs=xs,一个 init-capture 需要有一个 初始化器)。你不能同时拥有两者。