两侧都带有省略号的Lambda Pack捕获-是什么意思?

Vit*_*meo 17 c++ lambda variadic-templates c++20

批准用于C ++ 20的P0780 (“允许在lambda init-capture中扩展包”)允许通过...在包扩展之前放置省略号()来生成闭合数据包,作为lambda捕获的一部分。

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

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

在试用此功能时,我想到了这个神秘的构造:

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

int main()
{
    foo(0, 1, 2);
}
Run Code Online (Sandbox Code Playgroud)

Godbolt.org上的实时示例

g ++(trunk)对其进行编译,但是老实说,我一直在努力理解其含义。这是什么意思?生成闭包作为数据成员将具有什么?

Bar*_*rry 17

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

捕获
    简单捕获 ...opt
    ...opt 初始捕获

你可以要么有一个简单的捕获(这是xs...),或者你可以有一个初始化捕获(这将是...xs=xs,一个INIT捕捉需要有一个初始化)。您不能一举两得。