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)
g ++(trunk)对其进行编译,但是老实说,我一直在努力理解其含义。这是什么意思?生成闭包作为数据成员将具有什么?
Bar*_*rry 17
它应该是格式错误的。提起的89686(...已经修复!)[expr.prim.lambda.capture]中的语法为:
捕获:
简单捕获...opt
...opt 初始捕获
你可以要么有一个简单的捕获(这是xs...),或者你可以有一个初始化捕获(这将是...xs=xs,一个INIT捕捉需要有一个初始化)。您不能一举两得。